我有一个Dataframe df
,每天都有零星的工作日行(即每个工作日并不总是有一行。)
对于df
中的每一行,我想创建一次一个月的历史重采样平均值dfm
。例如,如果我有一行2018-02-22
,那么我想要滚动意味着以下日期范围内的行:
2018-01-23 : 2018-02-22
2017-12-23 : 2018-01-22
2017-11-23 : 2017-12-22
但是我无法使用conventional offsets找到一种方法来保持这个挂钩到月份的特定日期。例如,如果我这样做:
dfm = df.resample('30D').mean()
然后我们看到两个问题:
它引用了DataFrame的开头。事实上,我无法找到一种方法来强制.resample()
将自己固定到DataFrame的末尾 - 即使我让它在df_reversed = df.loc[:'2018-02-22'].iloc[::-1]
上运行。有没有办法去" peg"重新采样到DataFrame中最早的日期以外的东西? (理想情况下,当我在每行的日期重新取样时运行一些lambda时,每个特定的行都挂了?)
它会随着时间的推移而漂移,因为不是每个月都是30天。所以当我回到过去时,我会发现间隔12"月"先前的结束2017-02-27
,而不是我想要的2017-02-22
。
知道我想通过非重叠"月来重新采样,"第二个问题可以在月份29-31中明确定义:例如,如果我要求重新采样以及2018-03-31'然后日期范围将在每个月的月末结束:
2018-03-01 : 2018-03-31
2018-02-01 : 2018-02-28
2018-01-01 : 2018-02-31
尽管如此,我还不知道:在熊猫中有没有好的或简单的方法呢?
给出如下内容:
someperiods = 20 # this can be a number of days covering many years
somefrequency = '8D' # this can vary from 1D to maybe 10D
rng = pd.date_range('2017-01-03', periods=someperiods, freq=somefrequency)
df = pd.DataFrame({'x': rng.day}, index=rng) # x in practice is exogenous data
from pandas.tseries.offsets import *
df['MonthPrior'] = df.index.to_pydatetime() + DateOffset(months=-1)
现在:
对于df
中的每一行:计算df['PreviousMonthMean']
=范围df.x
中所有[df.MonthPrior, df.index)
的滚动平均值。在此示例中,生成的DataFrame将为:
Index x MonthPrior PreviousMonthMean
2017-01-03 3 2016-12-03 NaN
2017-01-11 11 2016-12-11 3
2017-01-19 19 2016-12-19 7
2017-01-27 27 2016-12-27 11
2017-02-04 4 2017-01-04 19
2017-02-12 12 2017-01-12 16.66666667
2017-02-20 20 2017-01-20 14.33333333
2017-02-28 28 2017-01-28 12
2017-03-08 8 2017-02-08 20
2017-03-16 16 2017-02-16 18.66666667
2017-03-24 24 2017-02-24 17.33333333
2017-04-01 1 2017-03-01 16
2017-04-09 9 2017-03-09 13.66666667
2017-04-17 17 2017-03-17 11.33333333
2017-04-25 25 2017-03-25 9
2017-05-03 3 2017-04-03 17
2017-05-11 11 2017-04-11 15
2017-05-19 19 2017-04-19 13
2017-05-27 27 2017-04-27 11
2017-06-04 4 2017-05-04 19
如果我们可以做到那么远,那么我需要找到一种有效的方法来迭代它,以便df
中的每一行我可以聚合连续但非重叠 {{1从给定的DateTimeIndex ....