【发布时间】:2020-09-29 01:54:34
【问题描述】:
我想使用特定日期(或月份)作为第一个 bin 的边缘重新采样 pandas 对象。例如,在下面的 sn-p 中,我希望我的第一个索引值为 2020-02-29,我很乐意指定 start=2 或 start="2020-02-29"。
>>> dates = pd.date_range("2020-01-29", "2021-07-04")
>>> s = pd.Series(range(len(dates)), index=dates)
>>> s.resample('4M').count()
2020-01-31 3
2020-05-31 121
2020-09-30 122
2021-01-31 123
2021-05-31 120
2021-09-30 34
Freq: 4M, dtype: int64
到目前为止,这是我能想到的最干净的用法 pd.cut 和 groupby:
>>> rule = "4M"
>>> start = pd.Timestamp("2020-02-29") - pd.tseries.frequencies.to_offset(rule)
>>> end = s.index.max() + pd.tseries.frequencies.to_offset(rule)
>>> bins = pd.date_range(start, end, freq=rule)
>>> gb = s.groupby(pd.cut(s.index, bins)).count()
>>> gb.index = gb.index.categories.right
>>> gb
2020-02-29 32
2020-06-30 122
2020-10-31 123
2021-02-28 120
2021-06-30 122
2021-10-31 4
dtype: int64
【问题讨论】:
-
可以使用
pd.cut(s.index, bins, labels=bins[1:])进行分组;在剪切中指定 bin 可以为您节省重新定义索引的步骤。此外,由于日期的日期与“4M”偏移量完全无关,您可以通过仅指定 YM 作为开始来消除歧义:pd.Timestamp("2020-02")。除此之外,你的削减几乎是要走的路。
标签: python pandas dataframe time-series pandas-resample