2014-06-06 22 views
5

Rozważmy plik wejściowy, b.dat:Pandy - konwersja dataframe multi-indeks obiektu datetime

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ę Grupa miesięczne sumy tak:

b=pd.read_csv('b.dat') 
b['date']=pd.to_datetime(b['date'],format='%m/%d/%y %I:%M%p') 
b.index=b['date'] 
bg=pd.groupby(b,by=[b.index.year,b.index.month]) 
bgs=bg.sum() 

Indeks zgrupowanych sumy wygląda :

bgs 

      number 
2011 2  1 
    3  2 
    4  8 
    5  14 
2014 5  13 

bgs.index 

MultiIndex(levels=[[2011, 2014], [2, 3, 4, 5]], 
     labels=[[0, 0, 0, 0, 1], [0, 1, 2, 3, 3]]) 

Chciałbym sformatować indeks na format daty (dni mogą być f irst miesiąca).

Próbowałem następujące:

bgs.index = pd.to_datetime(bgs.index) 

i

bgs.index = pd.DatetimeIndex(bgs.index) 

Zarówno niepowodzeniem. Czy ktoś wie, jak mogę to zrobić?

+0

Otrzymuję błąd, jeśli używam tego kodu bezpośrednio z Pandami 0.13. Przerywa on wywołanie 'pd.to_datetime', twierdząc, że użycie'% p' jest niepoprawne poprzez 'KeyError: 'p'' w' /pandas/tslib.so w pandas.tslib.array_strptime (pandy/tslib.c : 20989) '. – ely

+0

W rzeczywistości mogę odtworzyć błąd pandy z dowolnym ciągiem wymagającym przeanalizowania "am" lub "pm". Musi istnieć błąd w obsłudze tego, jak zostanie przekazany do 'strftime' lub cokolwiek innego. – ely

+0

Otworzył [tutaj problem pand] (https://github.com/pydata/pandas/issues/7381). – ely

Odpowiedz

5

Rozważmy resample przez „M” zamiast grupowania według atrybutów DatetimeIndex:

In [11]: b.resample('M', how='sum').dropna() 
Out[11]: 
      number 
date 
2011-02-28  1 
2011-03-31  2 
2011-04-30  8 
2011-05-31  14 
2014-05-31  13 

Uwaga: musisz upuścić NaN, jeśli nie chcesz miesięcy pomiędzy.

+0

To wielkie dzięki - Próbuję znaleźć więcej informacji na temat parametru "reguły". Skąd wiesz, że grupy "M" na miesiąc. Chciałbym wiedzieć, co jeszcze można zrobić. Jest możliwe wyszukiwane hasło, którego nie znam, aby znaleźć je na stronach podręcznika? – atomh33ls

+1

Słowo kluczowe to "offset" http://pandas.pydata.org/pandas-docs/stable/timeseries.html#offset-aliases :) –

+0

wow. dzięki :-) – atomh33ls

4

Można utworzyć kolumnę z indeksu poprzez obliczenia data chcesz, a następnie ustawić, że jako indeks:

bgs['expanded_date'] = bgs.index.map(lambda x: datetime.date(x.year, x.month, 1)) 
bgs.set_index('expanded_date')