LoginSignup
AKei
@AKei (K ei)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

pandasでresample間隔と違うスライドで集約する方法

Discussion

解決したいこと

python(pandas)で
欠損のない毎秒データを15分スライドで1時間分を集約(平均・偏差)する方法について教えてください。

とりあえずの解決

pd.concat([df_raw.resample("1H").sum(),
           df_raw.resample("1H",offset="15T").sum(),
           df_raw.resample("1H",offset="30T").sum(),
           df_raw.resample("1H",offset="45T").sum()]).sort_index()

で、それらしきことはできているのですが、スマートではないと思うので、何かいい方法があれば教えてください。

0

df.rolling()を使いましょう。
pandasで窓関数を適用するrollingを使って移動平均などを算出 | note.nkmk.me

例えば、

df_raw.rolling("1H").sum()[::60*15]
0Like

@nkay さん
ありがとうございます。やっぱそれしかないんですね。
df.rolling()だと無駄が多い気がしてやってなかったんですが、実測して比較してみます。

0Like
df_raw.resample("15min", closed="right", label="right").sum().rolling("1H").sum()

とする方法もあります。

以下のようにNumPyの機能を使うと高速に処理できますが、コードが煩雑に思われるかもしれません。この例では特定の1列に対してしか機能しません。

window_size = 60*60  # 1H
step_size = 60*15  # 15min
arr = np.lib.stride_tricks.sliding_window_view(df_raw["colA"].to_numpy(), window_size)[::step_size].sum(1)
pd.DataFrame(arr, index=df_raw.index[window_size::step_size])

pandasの次回バージョン1.5では、最も簡単に

df_raw.rolling("1H", step=60*15).sum()

と書くことが可能になる予定です。

1Like

Your answer might help someone💌