Pandas数据帧.重采样每月特定日期的月抵销

2024-05-16 02:58:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧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()

然后我们看到两个问题:

  1. 它引用数据帧的开头。事实上,我找不到一种方法来强制.resample()将自己绑定到数据帧的末尾,即使我让它对df_reversed = df.loc[:'2018-02-22'].iloc[::-1]进行操作。有没有一种方法可以将重采样“钉”到数据帧中最早的日期之外的某个地方?(理想情况下,当我从每一行的日期对相关的历史重采样运行一些lambda时,最好与每一行特定的行挂钩?)

  2. 它会随着时间推移而漂移,因为不是每个月都有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
  • 等等

不过,我也不知道:在熊猫身上,有没有一种好的或简单的方法可以做到这一点?在


tl;dr:

假设如下:

^{pr2}$

现在:

对于df中的每一行:计算df['PreviousMonthMean']=范围df.x内所有df.x的滚动平均值。在本例中,生成的数据帧将是:

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中的每一行,我可以从给定的DateTimeIndex一次聚合连续但不重叠的值。。。。在


Tags: 数据方法df历史mean平均值resample末尾