【问题标题】:how to change the order of resampling in python timeseries如何更改python时间序列中的重采样顺序
【发布时间】:2013-03-22 21:00:59
【问题描述】:

我有以下 python pandas 时间序列

index = pandas.date_range('4/1/2012','9/30/2012', freq='M')
df = pandas.DataFrame(numpy.random.randn(len(index),1), index=index)
df = 
2012-04-30 1.06
2012-05-31 0.82
2012-06-30 0.65
2012-07-31 1.12
2012-08-31 1.09
2012-09-30 0.65

然后我将频率从一个月改为两个月

df_new = df.resample('2M')

重采样函数从最早的日期开始到最后一个日期。我得到的输出如下:

df_new = 
2012-04-30 ...
2012-06-30 ...
2012-08-31 ...
2012-10-30 ...

而我希望算法以相反的顺序重新采样。我想要这样的输出:

df_new = 
2012-05-31 ...
2012-07-31 ...
2012-09-30 ...

谁能帮忙解决这个问题..提前谢谢

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    好的,这比它应该的更复杂 - 但是这里是

    In [282]: df
    Out[282]:
                       0
    2012-04-30  0.583255
    2012-05-31 -0.247403
    2012-06-30  0.816290
    2012-07-31 -1.989587
    2012-08-31  0.740463
    2012-09-30  0.971749
    
    
    In [279]: df.resample('2M', how='last', closed='left', loffset='-1M')
    Out[279]:
                       0
    2012-05-31 -0.247403
    2012-07-31 -1.989587
    2012-09-30  0.971749
    
    
    how='last' gets last value in group
    closed='left' forces first date[2012-04-30] to be the start of the group (maybe side effect)
    loffset='-1M' adjust label appropriately
    

    【讨论】:

    • 哦,嗯...实际上重新阅读我认为loffset 不够的问题是对的,您需要how='last' 和loffset。我希望问题也包含所需的数据对齐方式,以便更清晰。
    • how='last' 有帮助,但不能完全解决问题。这是因为重采样假设第一个日期 [2012-04-30] 是时间段 [6M] 的结束。如果这可以通过参数控制,它会解决问题
    【解决方案2】:

    使用loffset参数:

    In [8]: df
    Out[8]:
                       0
    2012-04-30  0.667305
    2012-05-31 -1.353332
    2012-06-30  0.132986
    2012-07-31 -0.697344
    2012-08-31 -1.043487
    2012-09-30 -0.050352
    
    In [9]: df.resample('2M', loffset='M')
    Out[9]:
                       0
    2012-05-31  0.667305
    2012-07-31 -0.610173
    2012-09-30 -0.870416
    2012-11-30 -0.050352
    

    【讨论】:

    • 请参阅下面的 user1827356 答案,您实际上需要 loffset 和 how='last' 在这里
    【解决方案3】:

    这些事情往往比您最初预期的要复杂得多。我同意 Chang 的观点,有一个非常清晰的例子来说明应该如何精确对齐会有所帮助。请注意,示例中的输入数据也具有每月频率也很重要。例如,如果输入频率为天,则上述解决方案的最终对齐方式会发生变化,请参阅:

    import pandas as pd
    
    index = pd.date_range('4/1/2012','9/30/2012', freq='D')
    df = pd.DataFrame({'Date': index, 'Doy': index.dayofyear}, index=index) 
    
    df.resample('2M', how='last', closed='left', loffset='-1M')
    
                               Date  Doy
    2012-04-30  2012-05-30 00:00:00  151
    2012-06-30  2012-07-30 00:00:00  212
    2012-08-31  2012-09-29 00:00:00  273
    2012-10-31  2012-09-30 00:00:00  274
    

    也可以使用“MS”频率,创建另一种方法:

    df.resample('2MS', how='last', loffset='2M')
    
                               Date  Doy
    2012-05-31  2012-05-31 00:00:00  152
    2012-07-31  2012-07-31 00:00:00  213
    2012-09-30  2012-09-30 00:00:00  274
    

    这一切都归结为您将如何定义垃圾箱的开始和结束。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-26
      • 2014-07-24
      • 1970-01-01
      • 2020-12-28
      • 2017-02-20
      • 2019-03-14
      • 1970-01-01
      相关资源
      最近更新 更多