Esto podría ser más fácil de explicar con un conjunto de datos de muestra.
Crear datos de muestra
Asumamos que tenemos una sola columna de marcas de tiempo, date
y la otra columna nos gustaría realizar una agregación en, a
.
df = pd.DataFrame({'date':pd.DatetimeIndex(['2012-1-1', '2012-6-1', '2015-1-1', '2015-2-1', '2015-3-1']),
'a':[9,5,1,2,3]}, columns=['date', 'a'])
df
date a
0 2012-01-01 9
1 2012-06-01 5
2 2015-01-01 1
3 2015-02-01 2
4 2015-03-01 3
Hay varias formas de agrupar por año
- Utilice el descriptor de acceso dt con
year
propiedad
- Ponga
date
en índice y use la función anónima para acceder al año
resample
Método de uso
- Convertir a período pandas
.dt
accesor con year
propiedad
Cuando tiene una columna (y no un índice) de marcas de tiempo de pandas, puede acceder a muchas más propiedades y métodos adicionales con el dt
descriptor de acceso. Por ejemplo:
df['date'].dt.year
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: int64
Podemos usar esto para formar nuestros grupos y calcular algunas agregaciones en una columna en particular:
df.groupby(df['date'].dt.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012 14 7 9
2015 6 2 3
poner la fecha en el índice y usar la función anónima para acceder al año
Si establece la columna de fecha como índice, se convierte en un DateTimeIndex con las mismas propiedades y métodos que el dt
descriptor de acceso proporciona a las columnas normales
df1 = df.set_index('date')
df1.index.year
Int64Index([2012, 2012, 2015, 2015, 2015], dtype='int64', name='date')
Curiosamente, al usar el método groupby, puede pasarle una función. Esta función se pasará implícitamente al índice del DataFrame. Entonces, podemos obtener el mismo resultado de arriba con lo siguiente:
df1.groupby(lambda x: x.year)['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3
Usa el resample
método
Si su columna de fecha no está en el índice, debe especificar la columna con el on
parámetro. También debe especificar el alias de desplazamiento como una cadena.
df.resample('AS', on='date')['a'].agg(['sum', 'mean', 'max'])
sum mean max
date
2012-01-01 14.0 7.0 9.0
2013-01-01 NaN NaN NaN
2014-01-01 NaN NaN NaN
2015-01-01 6.0 2.0 3.0
Convertir a período pandas
También puede convertir la columna de fecha en un objeto Pandas Period. Debemos pasar el alias de desplazamiento como una cadena para determinar la duración del período.
df['date'].dt.to_period('A')
0 2012
1 2012
2 2015
3 2015
4 2015
Name: date, dtype: object
Entonces podemos usar esto como un grupo
df.groupby(df['date'].dt.to_period('Y'))['a'].agg(['sum', 'mean', 'max'])
sum mean max
2012 14 7 9
2015 6 2 3