如何在熊猫中将月度数据转换为季度
Posted
技术标签:
【中文标题】如何在熊猫中将月度数据转换为季度【英文标题】:how to convert monthly data to quarterly in pandas 【发布时间】:2017-03-22 16:28:43 【问题描述】:我有每月的数据。我想将其转换为 3 个月的“期间”,第一季度从 1 月开始。因此,在下面的示例中,前 3 个月的聚合将转换为 q2 的开始(所需格式:1996q2)。将 3 个月度值组合在一起的数据值是 3 列的平均值(平均值)。从概念上讲,并不复杂。有谁知道如何一口气做到这一点?潜在地,我可以通过循环做很多艰苦的工作,然后硬编码出来,但我是 pandas 的新手,正在寻找比蛮力更聪明的东西。
1996-04 1996-05 1996-06 1996-07 ..... 25 19 37 40所以我正在寻找:
1996q2 1996q3 1996q4 1997q1 1997q2 ..... 平均 平均 平均 ... ...【问题讨论】:
【参考方案1】:只需添加到上面@MaxU 的答案,将生成的PeriodIndex
列转换回str
并在年份和季度数之间添加空格(即1999 Q1
,而不是1999Q1
),您可以这样做:
res = res.columns.to_series().astype(str)
【讨论】:
【参考方案2】:您可以将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')
【讨论】:
我忽略了pd.PeriodIndex
。我不会了。
@piRSquared,是的,很方便
不幸的是pd.PeriodIndex
导致列名变成pandas.tseries.period.PeriodIndex
格式。我如何避免这种情况,因为我需要“2000Q3”作为字符串?
我决定发表评论,因为 OP 的预期答案是一个数据框,其列像 1996q2
而不是 1996Q2
。因此,我试图获得 OP 的预期答案
@MaxU 我记得在 Coursera 上做了一个问题来处理这个问题,我很挣扎。我希望我当时看到这种方法。 +1以上是关于如何在熊猫中将月度数据转换为季度的主要内容,如果未能解决你的问题,请参考以下文章