我有每月的数据。我想将其转换为 3 个月的“周期”,其中 q1 从 1 月开始。因此,在下面的示例中,前 3 个月的聚合将转换为第 2 季度的开始(所需格式:1996q2)。将 3 个月度值混合在一起得到的数据值是 3 列的平均值。从概念上讲,并不复杂。有谁知道如何一举完成?潜在地,我可以通过循环做很多艰苦的工作,然后硬编码出来,但我对 pandas 很陌生,正在寻找比暴力更聪明的东西。
1996-04 1996-05 1996-06 1996-07 .....
25 19 37 40
所以我正在寻找:
1996q2 1996q3 1996q4 1997q1 1997q2 .....
avg avg avg ... ...
您可以使用pd.PeriodIndex(..., freq='Q') http://pandas.pydata.org/pandas-docs/stable/timeseries.html#periodindex-and-period-range和这个结合groupby(..., 轴=1) http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.groupby.html:
In [63]: df
Out[63]:
1996-04 1996-05 2000-07 2000-08 2010-10 2010-11 2010-12
0 1 2 3 4 1 1 1
1 25 19 37 40 1 2 3
2 10 20 30 40 4 4 5
In [64]: df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1).mean()
Out[64]:
1996Q2 2000Q3 2010Q4
0 1.5 3.5 1.000000
1 22.0 38.5 2.000000
2 15.0 35.0 4.333333
UPDATE:将结果 DF 中的列作为字符串而不是period
dtype:
In [66]: res = (df.groupby(pd.PeriodIndex(df.columns, freq='Q'), axis=1)
.mean()
.rename(columns=lambda c: str(c).lower()))
In [67]: res
Out[67]:
1996q2 2000q3 2010q4
0 1.5 3.5 1.000000
1 22.0 38.5 2.000000
2 15.0 35.0 4.333333
In [68]: res.columns.dtype
Out[68]: dtype('O')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)