【问题标题】: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 ..... 平均 平均 平均 ... ...

【问题讨论】:

    标签: python pandas dataframe group-by


    【解决方案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
      猜你喜欢
      • 2019-12-06
      • 1970-01-01
      • 2020-08-28
      • 2021-10-14
      • 2023-03-31
      • 2016-07-13
      • 1970-01-01
      • 2021-03-08
      • 2022-11-10
      相关资源
      最近更新 更多