【Python】pandas のresampleで”TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of ‘RangeIndex'”が出た時の対処法
概要
pythonのpandasで日付などでグループ化して集計した場合に使用できるresampleメソッドがあります。週単位、日単位、時間単位などでグループ化して集計する場合に非常に便利ですが、resampleメソッドを使用するのに適した形にしないとTypeエラーを吐きます。
今回はTypeエラーの例と、発生した場合の対処方法について説明していきます。
検証環境
- python 3.8.10
- pandas 1.3.5
resampleの使いどころの例
例えば次のようなデータがあったとします。
df.head()
これを月毎の集計して以下のような結果を取得したいという場合があります。そんなときはpandasのresampleメソッドを使用することができます。
df.resample('M').sum()
この例では元データから同じ月をグルーピングし、グループ内でvalueの列の値を足し合わせた結果を返しています。
ただし、このresample関数ですが、簡単に見えてちょっと癖があります。
これからよく起こるエラーの例について紹介していきたいと思います。
エラーの例
例えば、次のコードを実行するとエラーが返ってきます。
import pandas as pd
df = pd.DataFrame([['2021/01/01 00:00:00', 1], ['2021/01/10 00:00:00', 2], ['2021/02/01 00:00:00', 3], ['2021/02/10 00:00:00', 4]], columns=['datetime', 'value'] )
df.resample('M').sum()
TypeError: Only valid with DatetimeIndex, TimedeltaIndex or PeriodIndex, but got an instance of ‘RangeIndex’
エラーの原因
データフレームであればresampleがすぐ使えるわけではなく、resample型を使用するためには大前提としてdatetime型のSeriesが必要です。
そのため、datetime型の列を用意してやる必要があります。
import pandas as pd
df = pd.DataFrame([['2021/01/01 00:00:00', 1], ['2021/01/10 00:00:00', 2], ['2021/02/01 00:00:00', 3], ['2021/02/10 00:00:00', 4]], columns=['datetime', 'value'] )
df['datetime'] = pd.to_datetime(df['datetime'])
df.resample('M').sum()
pandasのto_datetimeメソッドを使用することで、’datetime’列をdatetime型に変更しました。しかし、これでもまだ同様のエラーが発生します。
実はresampleのもう一つの使用条件として、このdatetime型の列はIndexとして設定されている必要があります。次のコードであればエラーは発生しません。
import pandas as pd
df = pd.DataFrame([['2021/01/01 00:00:00', 1], ['2021/01/10 00:00:00', 2], ['2021/02/01 00:00:00', 3], ['2021/02/10 00:00:00', 4]], columns=['datetime', 'value'] )
df['datetime'] = pd.to_datetime(df['datetime']) # 日時情報が入った列をdatetime型へ変換
df.set_index('datetime', inplace=True) #indexにdatetime列を指定し、置き換え
df.resample('M').sum()
まとめ
pandas resampleメソッドを使用する場合にはdatetime型にすることと、indexにその列を指定しておくことが必要でした。