web-dev-qa-db-fra.com

comment convertir les données mensuelles en données trimestrielles en pandas

J'ai des données mensuelles. Je veux le convertir en "périodes" de 3 mois où le premier trimestre commence en janvier. Ainsi, dans l'exemple ci-dessous, l'agrégation des 3 premiers mois se traduirait par le début de q2 (format souhaité: 1996q2). Et la valeur des données qui résulte du regroupement de 3 valeurs mensuelles est une moyenne (moyenne) de 3 colonnes. Conceptuellement, pas compliqué. Est-ce que quelqu'un sait comment le faire d'un seul coup? Potentiellement, je pourrais faire beaucoup de travail dur en boucle et juste coder en dur, mais je suis nouveau à pandas et je cherche quelque chose de plus intelligent que la force brute.

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

Je recherche donc:

 1996q2 1996q3 1996q4 1997q1 1997q2 ..... 
 Moy moy moy moy ... ... 
17
alernerdev

vous pouvez utiliser pd.PeriodIndex (..., freq = 'Q') en conjonction avec 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

[~ # ~] mise à jour [~ # ~] : pour obtenir des colonnes dans un DF sous forme de chaînes au lieu de 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