我有以下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 ...
有人可以帮忙解决这个问题..提前感谢
答案 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
这一切都取决于你如何定义垃圾箱的开始和结束。