Agrupar DataFrame por inicio de década utilizando pandas Grouper

Tengo un dataframe de observaciones diarias del 01-01-1973 al 12-31-2014.

He estado utilizando Pandas Grouper y todo ha funcionado bien para cada frecuencia hasta ahora: quiero agruparlos por décadas 70, 80, 90, etc.

Traté de hacerlo como

import pandas as pd df.groupby(pd.Grouper(freq = '10Y')).mean() 

Sin embargo, esto los agrupa en 73-83, 83-93, etc.

Puede hacer una pequeña aritmética en el año para dejarlo en la década más cercana:

 df.groupby(df.index.year // 10 * 10).mean() 

pd.cut también trabaja para especificar una frecuencia regular con un año de inicio específico.

 import pandas as pd df date val 0 1970-01-01 00:01:18 1 1 1979-12-31 18:01:01 12 2 1980-01-01 00:00:00 2 3 1989-01-01 00:00:00 3 4 2014-05-06 00:00:00 4 df.groupby(pd.cut(df.date, pd.date_range('1970', '2020', freq='10YS'), right=False)).mean() # val #date #[1970-01-01, 1980-01-01) 6.5 #[1980-01-01, 1990-01-01) 2.5 #[1990-01-01, 2000-01-01) NaN #[2000-01-01, 2010-01-01) NaN #[2010-01-01, 2020-01-01) 4.0 

El método de @cᴏʟᴅsᴘᴇᴇᴅ es más limpio que este, pero manteniendo su método pd.Grouper , una forma de hacerlo es fusionar sus datos con un nuevo intervalo de fechas que comienza al comienzo de una década y termina al final de una década, luego se usa su Grouper en eso. Por ejemplo, dado un df inicial:

  date data 0 1973-01-01 -1.097895 1 1973-01-02 0.834253 2 1973-01-03 0.134698 3 1973-01-04 -1.211177 4 1973-01-05 0.366136 ... 15335 2014-12-27 -0.566134 15336 2014-12-28 -1.100476 15337 2014-12-29 0.115735 15338 2014-12-30 1.635638 15339 2014-12-31 1.930645 

date_range eso con un date_range date_range que va desde 1980 hasta 2020:

 new_df = pd.DataFrame({'date':pd.date_range(start='01-01-1970', end='12-31-2019', freq='D')}) df = new_df.merge(df, on ='date', how='left') 

Y usa tu Grouper :

 df.groupby(pd.Grouper(key='date', freq = '10AS')).mean() 

Lo que te da:

  data date 1970-01-01 -0.005455 1980-01-01 0.028066 1990-01-01 0.011122 2000-01-01 0.011213 2010-01-01 0.029592 

Lo mismo, pero de una vez, podría verse así:

 (df.merge(pd.DataFrame( {'date':pd.date_range(start='01-01-1970', end='12-31-2019', freq='D')}), how='right') .groupby(pd.Grouper(key='date', freq = '10AS')) .mean()) 

Algo como

 df.groupby(df.index.astype(str).str[:2]+'0').mean()