以下を使用して、毎日の指標を含むデータフレームを30日の期間でグループ化しようとしていますGrouper
。
import random
import pandas as pd
n_rows = 100
df = pd.DataFrame({"date": pd.date_range(periods=n_rows, end='2020-04-15'), "a": range(n_rows)})
aggregated = df.groupby(pd.Grouper(key="date", freq="30D")).sum().reset_index()
print(aggregated.date.max())
# out: Timestamp('2020-04-06 00:00:00')
aggregates
変更の最新の日付はn_rows
次のとおりです。最後の期間が( '2020-04-15'-30D、' 2020-04-15 ')になるように、常に最初のデータフレームの最後の日付にします。私は得るだろう:
print(aggregated.date.max())
# out: Timestamp('2020-04-15 00:00:00')
私は最新のグループに興味があるので、最初の(最も古い)グループがどのように構成されているかは気にしません。
私はパラメータの組み合わせを試してみましたがlabel
、closed
、convention
、loffset
、base
(ドキュメントここでは、リンクの説明を入力します)が、私は働いて解決策を見つけることができません: -私の最初のアプローチは、必ず期間を使用して、右方向にconstuctedさせるしようとしていたlabel="right"
とclosed="right"
、そしてconvention
、しかし、何も機能しませんでした:
aggregated = df.groupby(pd.Grouper(key="date", freq="30D", label="right", closed="right")).sum().reset_index()
print(aggregated.date.max())
# out: Timestamp('2020-04-16 00:00:00')
loffset=f"{n_rows % 30}D"
、またはbase=+/- n_rows % 30
何も使用せずに、起点の日付に影響を与えずにグループをオフセットしようとしました。DateOffset
オブジェクトを作成しようとしましたが、で機能するサンプルが見つかりませんでしたGrouper
。これが実現可能かどうか疑問に思っていますが、それ以来少し驚いています。
私が見ることができる提案または同様の例はありますか?
ありがとう!
ではresample
、あなたは使用する必要がbase
ビンを相殺するために、引数を。タイムスパン全体の剰余除算を頻度で使用して、必要なものを決定できます。次に、適切なラベルを選択し、右側で閉じます(最新のものから30Dであるため)
base=((df.date.max()-df.date.min())%pd.Timedelta('30D')).days
df.resample('30D', on='date', base=base ,label='right', closed='right').sum()
a
date
2020-01-16 45
2020-02-15 735
2020-03-16 1635
2020-04-15 2535
#Similarly with a `pd.Grouper`
df.groupby(pd.Grouper(freq='30D', key='date', base=base ,label='right', closed='right')).sum()
あなたが放棄resample
する気があるなら、あなたはいくつかの非常に基本的な数学をして、を使うことができますgroupby
。最新の日付から30日間のグループを形成し、集計します
grps = (df.date-df.date.max()-pd.Timedelta(days=1)).dt.floor('30D')
df.groupby(grps).agg({'date': 'last', 'a': 'sum'})
date a
date
-120 days 2020-01-16 45
-90 days 2020-02-15 735
-60 days 2020-03-16 1635
-30 days 2020-04-15 2535
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加