2013-04-28 20 views
32

Wydaje się, że byłoby to dość proste, ale po prawie cały dzień nie znalazłem rozwiązania. Załadowałem moją ramkę danych za pomocą read_csv i łatwo analizuję, łączę i indeksuję kolumnę z datą i godziną w jedną kolumnę, ale teraz chcę móc po prostu przekształcać i wykonywać obliczenia na podstawie zgrupowań godzin i minut, podobnych do tego, co można zrobić w excel pivot.Python Pandy: Grupa datetime kolumna na godzinę i minuty agregacji

W jaki sposób dokonać ponownego próbkowania do godziny lub minuty, ale zachowuje część daty związaną z każdą godziną/minutą, natomiast chcę agregować zestaw danych TYLKO do godziny i minuty, podobnie jak grupowanie w programie Excel i wybierając "godzinę" i "minutę", ale nie wybierając niczego innego.

Każda pomoc zostanie bardzo doceniona.

+0

Czy pomogłoby uzyskać obiekt 'time' z każdego' datetime', który posiadasz? Możesz utworzyć obiekt 'pandas.Series' ze swojego' dataframe.index', a następnie przypisać go do indeksu (zastępując bieżący). Czy możesz "wydrukować" niektóre wiersze swojej ramki danych? – heltonbiker

+1

Dziękuję. Nie jestem zaznajomiony z używaniem obiektu czasu do uzyskania czasu z kolumny datetime, jeśli o to ci chodzi. Właśnie wymyśliłem jeden sposób, który jest bardzo zbliżony do tego, czego potrzebuję, używając następującego kodu odpowiednio co godzinę i drobiazgowo, ale czy jest łatwiejszy sposób na zrobienie tego, zwłaszcza sposób na wspólną godzinę i minutę ?: hourly = ims_havas.groupby (ims_havas.index.hour) .sum() – horatio1701d

Odpowiedz

33

nie można zrobić, gdzie df to DataFrame:

times = pd.to_datetime(df.timestamp_col) 
df.groupby([times.hour, times.minute]).value_col.sum() 
+0

Peeerfect! Dziękuję bardzo za uratowanie reszty mojego dnia! – horatio1701d

+0

Tak, to działa również dla mnie, ale mam pytanie: jak mogę użyć tej "pogrupowanej serii czasowej" jako mojej osi X w matlibplot? –

+0

Miałem do czynienia z 'df.groupby ([times.dt.hour, times.dt.minute]) ...' – akilat90

9

natknąłem się na to, gdy szukałem tego typu GroupBy. Kod powyższego Wesa nie zadziałał dla mnie, nie jestem pewien, czy to dlatego, że z biegiem czasu zmienia się w pandas.

W pandas 0.16.2, co zrobiłem w końcu było:

grp = data.groupby(by=[data.datetime_col.map(lambda x : (x.hour, x.minute))]) 
grp.count() 

Musiałbyś (godzina, minuta) krotki jak zgrupowane indeksu. Jeśli chcesz multi-indeks:

grp = data.groupby(by=[data.datetime_col.map(lambda x : x.hour), 
         data.datetime_col.map(lambda x : x.minute)]) 
21

Kod Wesa nie działał dla mnie. Ale funkcja DatetimeIndex (docs) zrobił:

times = pd.DatetimeIndex(data.datetime_col) 
grouped = df.groupby([times.hour, times.minute]) 

Przedmiotem DatetimeIndex jest reprezentacją razy w pand. Pierwsza linia tworzy tablicę datetimes. Drugi wiersz wykorzystuje tę tablicę do uzyskania danych godzinowych i minutowych dla wszystkich wierszy, umożliwiając grupowanie danych (docs) według tych wartości.