2014-06-06 20 views
39

Rozważmy pliku csv:pandy dataframe GroupBy datetime miesięcy

string,date,number 
a string,2/5/11 9:16am,1.0 
a string,3/5/11 10:44pm,2.0 
a string,4/22/11 12:07pm,3.0 
a string,4/22/11 12:10pm,4.0 
a string,4/29/11 11:59am,1.0 
a string,5/2/11 1:41pm,2.0 
a string,5/2/11 2:02pm,3.0 
a string,5/2/11 2:56pm,4.0 
a string,5/2/11 3:00pm,5.0 
a string,5/2/14 3:02pm,6.0 
a string,5/2/14 3:18pm,7.0 

mogę to wczytać, a zmiany formy kolumnę dat w formacie datetime:

b=pd.read_csv('b.dat') 
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p') 

staram grupowanie danych według miesiąca. Wygląda na to, że powinien istnieć oczywisty sposób uzyskiwania dostępu do miesiąca i grupowania przez to. Ale nie mogę tego zrobić. Czy ktoś wie jak?

Co Obecnie próbuję jest ponowne indeksowanie według daty:

b.index=b['date'] 

mam dostępu miesiąc tak:

b.index.month 

Jednak nie wydaje się znaleźć funkcji do grudka razem przez miesiąc.

Odpowiedz

76

Udało się to zrobić:

df.groupby(by=[b.index.month, b.index.year]) 

Albo

df.groupby(pd.Grouper(freq='M')) # update for v0.21+ 
+36

myślę bardziej pandonic sposoby mają użyć 'resample' (kiedy to zapewnia funkcjonalność co potrzeba) lub użyć' TimeGrouper': 'df.groupby (pd.TimeGrouper (freq =” M ')) ' –

+5

, aby uzyskać wynik sumy lub średniej DataFrame,' df.groupby (pd.TimeGrouper (freq =' M ')) .sum() 'lub' df.groupby (pd.TimeGrouper (freq =' M ')). mean() ' – Alexandre

12

(aktualizacja: 2018)

Zauważ, że pd.Timegrouper są amortyzowane i zostaną usunięte. Użyj zamiast:

df.groupby(pd.Grouper(freq='M')) 
+1

Czytanie w 2018 roku :) – jtromans