Pandas DataFrame.resample每月偏离特定日期

时间:2018-02-22 23:08:45

标签: python pandas dataframe resampling

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

然后我们看到两个问题:

  1. 它引用了DataFrame的开头。事实上,我无法找到一种方法来强制.resample()将自己固定到DataFrame的末尾 - 即使我让它在df_reversed = df.loc[:'2018-02-22'].iloc[::-1]上运行。有没有办法去" peg"重新采样到DataFrame中最早的日期以外的东西? (理想情况下,当我在每行的日期重新取样时运行一些lambda时,每个特定的行都挂了?)

  2. 它会随着时间的推移而漂移,因为不是每个月都是30天。所以当我回到过去时,我会发现间隔12"月"先前的结束2017-02-27,而不是我想要的2017-02-22

  3. 知道我想通过非重叠"月来重新采样,"第二个问题可以在月份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:

    给出如下内容:

    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 ....

    一次返回一个日历月的值

0 个答案:

没有答案