Saltar al contenido

¿Cómo puedo agrupar por mes desde un campo de fecha usando Python/Pandas?

Mantén la atención ya que en este enunciado vas a hallar la respuesta que buscas.

Solución:

prueba esto:

In [6]: df['date'] = pd.to_datetime(df['date'])

In [7]: df
Out[7]: 
        date  Revenue
0 2017-06-02      100
1 2017-05-23      200
2 2017-05-20      300
3 2017-06-22      400
4 2017-06-21      500



In [59]: df.groupby(df['date'].dt.strftime('%B'))['Revenue'].sum().sort_values()
Out[59]: 
date
May      500
June    1000

Pruebe un grupo usando un mero de pandas:

df = pd.DataFrame('date':['6/2/2017','5/23/2017','5/20/2017','6/22/2017','6/21/2017'],'Revenue':[100,200,300,400,500])
df.date = pd.to_datetime(df.date)
dg = df.groupby(pd.Grouper(key='date', freq='1M')).sum() # groupby each 1 month
dg.index = dg.index.strftime('%B')

     Revenue
 May    500
June    1000

Para DataFrame con muchas filas, usando strftime ocupa más tiempo. Si la columna de fecha ya tiene dtype de datetime64[ns] (puedo usar pd.to_datetime() convertir, o especificar parse_dates durante la importación csv, etc.), se puede acceder directamente a la propiedad de fecha y hora para groupby etiquetas (Método 3). La aceleración es sustancial.

import numpy as np
import pandas as pd

T = pd.date_range(pd.Timestamp(0), pd.Timestamp.now()).to_frame(index=False)
T = pd.concat([T for i in range(1,10)])
T['revenue'] = pd.Series(np.random.randint(1000, size=T.shape[0]))
T.columns.values[0] = 'date'

print(T.shape) #(159336, 2)
print(T.dtypes) #date: datetime64[ns], revenue: int32

Método 1: strftime

%timeit -n 10 -r 7 T.groupby(T['date'].dt.strftime('%B'))['revenue'].sum()

1,47 s ± 10,1 ms por bucle (media ± desviación estándar de 7 ejecuciones, 10 bucles cada una)

Método 2: mero

%timeit -n 10 -r 7 T.groupby(pd.Grouper(key='date', freq='1M')).sum()
#NOTE Manually map months as integer 01..12 to strings

56,9 ms ± 2,88 ms por bucle (media ± desviación estándar de 7 ejecuciones, 10 bucles cada una)

Método 3: propiedades de fecha y hora

%timeit -n 10 -r 7 T.groupby(T['date'].dt.month)['revenue'].sum()
#NOTE Manually map months as integer 01..12 to strings

34 ms ± 3,34 ms por bucle (media ± desviación estándar de 7 ejecuciones, 10 bucles cada una)

Te mostramos comentarios y puntuaciones

Agradecemos que desees asistir nuestra ocupación exponiendo un comentario y valorándolo te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *