繁体   English   中英

如何在熊猫中将月度数据转换为季度数据

[英]how to convert monthly data to quarterly in pandas

我有月度数据。 我想将其转换为 3 个月的“周期”,其中 q1 于 1 月开始。 因此,在下面的示例中,前 3 个月的聚合将转换为 q2 的开始(所需格式:1996q2)。 将 3 个月值混合在一起得到的数据值是 3 列的平均值(平均值)。 从概念上讲,并不复杂。 有谁知道如何一举完成? 潜在地,我可以通过循环做很多艰苦的工作,只是硬编码它的地狱,但我是熊猫的新手,正在寻找比蛮力更聪明的东西。

1996-04   1996-05 1996-06  1996-07 .....
25          19       37      40

所以我在寻找:

1996q2  1996q3   1996q4  1997q1  1997q2 .....
 avg      avg      avg     ...     ...

您可以将pd.PeriodIndex(..., freq='Q')groupby(..., axis=1)结合使用:

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

更新:将结果 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')

只是添加到@MaxU 上面的答案,将生成的PeriodIndex列转换回str并在年份和季度号之间添加空格(即1999 Q1 ,而不是1999Q1 ),您可以这样做:

res = res.columns.to_series().astype(str)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM