如何在Python时间序列中改变重采样顺序
我有一个这样的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 ...
有人能帮我一下吗.. 提前谢谢你们
3 个回答
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
这最终取决于你如何定义一个区间的开始和结束。
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
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