web-dev-qa-db-ja.com

pandasで毎月のデータを四半期ごとに変換する方法

毎月のデータがあります。 1月にq1が始まる3か月の「期間」に変換したい。したがって、次の例では、最初の3か月の集計はq2の開始に変換されます(望ましい形式:1996q2)。また、3つの月の値をまとめた結果のデータ値は、3つの列の平均(平均)です。概念的には、複雑ではありません。誰もが一度にそれを行う方法を知っていますか?可能性としては、ループを介して多くのハードワークを実行し、それから地獄をハードコードすることができますが、私はpandasであり、ブルートフォースよりも賢い何かを探しています。

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

だから私は探しています:

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

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

[〜#〜] 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')
30
MaxU