IT Learning

実践形式でITのお勉強

Python

【Python】pandasで日時をグループ集計する方法

投稿日:

概要

pythonでデータを扱うのに便利なライブラリとしてはpandasがあります。

このpandasを用いてグループで集計する方法についてメモしておきます。

テストデータ

以下のようなテスト用の時系列データフレームを用意します。

import pandas as pd
from pandas import Series
datetime = pd.date_range(start='2021-12-31',end='2022-01-02', freq='30s')
df = pd.DataFrame(range(len(datetime)), index=date, columns = ['val'])
df.head()
df.tail()

方法1 : resampleを使う

日時のグルーピングについてはpandasのresampleメソッドを使用することで集計することができます。resampleはダウンサンプリングするためのメソッドですが、集計用途にも使用できます。

resample関数を使用するためには以下の二つの注意が必要です。

  • グルーピング対象項目はdatetime型にしてindexとしておく
df['datetime'] = pd.to_datetime(df['datetime'])
df.set_index('datetime', inplace=True)

あとはresampleの引数にグルーピングしたい単位を入力すれば簡単に集計されます。

df.resample('Y').sum()
df.resample('M').sum()

方法2 : Grouperを使う

pandasのGrouperを使用する方法です。こちらの場合はダウンサンプリングではなく、単にある項目でグループ化できる機能であるため、集計用途であればこちらの方が汎用性が高いと思います。

基本的な使い方としてはこのような形です。

df.groupby(pd.Grouper(freq="Y")).count()
df.groupby(pd.Grouper(freq="M")).count()

このようにresampleと同じような形で使用することができます。

また、Grouperの場合はindex以外の列を直接指定してグループ化することもできます。

一旦グループ化したいdatetime列をindexから外します。

df_notindex = df.reset_index().rename(columns={'index':'datetime'})
df_notindex.head()

Grouperの引数keyとしてdatetime列を渡すことで集計できます。

df_notindex.groupby(pd.Grouper(key="datetime",freq="Y")).count()

また、複数のカラムでグループしたい場合はgroupby自体の引数の中にリストで渡すことで実現できますので、汎用性が高いです。

pandas.groupby([pd.Grouper(key="datetime",freq="Y"),'column1','column2']).count()

まとめ

  • pandasで日時でグループ集計したい場合にはresampleやgroupby,Grouperが使用できる。
  • groupbyを使用した方が汎用性はありそう

Related

-Python

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です