web-dev-qa-db-fra.com

Comment puis-je regrouper par mois à partir d'un champ de date à l'aide de Python / Pandas

J'ai un df de trame de données qui est comme suit:

| date      | Revenue |
|-----------|---------|
| 6/2/2017  | 100     |
| 5/23/2017 | 200     |
| 5/20/2017 | 300     |
| 6/22/2017 | 400     |
| 6/21/2017 | 500     |

J'ai besoin de regrouper les données ci-dessus par mois pour obtenir la sortie en tant que:

| date | SUM(Revenue) |
|------|--------------|
| May  | 500          |
| June | 1000         |

J'ai essayé ce code mais cela n'a pas fonctionné:

df.groupby(month('date')).agg({'Revenue': 'sum'})

Je veux utiliser uniquement Pandas ou Numpy et aucune bibliothèque supplémentaire

11
Symphony

essaye ça:

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
24
shivsn

Essayez un groupe en utilisant un pandas Grouper :

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
14
qbzenker

Pour DataFrame avec plusieurs lignes, l'utilisation de strftime prend plus de temps. Si la colonne de date a déjà un dtype de datetime64[ns] (Peut utiliser pd.to_datetime() pour convertir, ou spécifier parse_dates Lors de l'importation csv, etc.), on peut accéder directement à la propriété datetime pour groupby labels (Méthode 3). L'accélération est substantielle.

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éthode 1: strftime

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

1,47 s ± 10,1 ms par boucle (écart moyen ± standard de 7 passages, 10 boucles chacun)

Méthode 2: mérou

%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 par boucle (moyenne ± écart standard de 7 pistes, 10 boucles chacune)

Méthode 3: propriétés datetime

%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 par boucle (moyenne ± écart standard de 7 pistes, 10 boucles chacune)

3
yongtw123