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()