如何在python时间序列中更改重采样的顺序

时间:2013-03-21 11:16:56

标签: python pandas

我有以下python pandas timeseries

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

有人可以帮忙解决这个问题..提前感谢

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

使用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

答案 2 :(得分:0)

这些东西往往比你想象的要复杂得多。我同意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

这一切都取决于你如何定义垃圾箱的开始和结束。