2013-01-13 15 views
9

mam ramki danych, składający się z szeregów czasowych, w odstępach 15-sekundowych:Grupa przez wiele jednostek czasu w PANDAS danych ramki

date_time    value  
2012-12-28 11:11:00 103.2 
2012-12-28 11:11:15 103.1 
2012-12-28 11:11:30 103.4 
2012-12-28 11:11:45 103.5 
2012-12-28 11:12:00 103.3 

Dane rozciągający się od wielu lat. Chciałbym pogrupować rok i czas, aby spojrzeć na rozkład efektów dnia na przestrzeni wielu lat. Na przykład, mogę chcieć obliczyć średnią i odchylenie standardowe każdego 15-sekundowego przedziału między dniami i przyjrzeć się, jak średnie i odchylenia standardowe zmieniają się od 2010, 2011, 2012 itd. Naiwnie wypróbowałem data.groupby(lambda x: [x.year, x.time]), ale nie praca. Jak mogę zrobić takie grupowanie?

Odpowiedz

17

W przypadku date_time nie jest twoja Index, date_time -indexed DataFrame mogą być tworzone z:

dfts = df.set_index('date_time') 

Stamtąd można grupować według przedziałów za pomocą

dfts.groupby(lambda x : x.month).mean() 

zobaczyć wartości średnie dla każdego miesiąc. Podobnie można wykonać standardowe odchylenia na przestrzeni lat.

Jeśli zrozumiałem przykładowe zadanie, które chciałbyś osiągnąć, możesz po prostu podzielić dane na lata, używając xs, pogrupować je i połączyć wyniki i zapisać je w nowym DataFrame.

years = range(2012, 2015) 
yearly_month_stats = [dfts.xs(str(year)).groupby(lambda x : x.month).mean() for year in years] 
df2 = pd.concat(yearly_month_stats, axis=1, keys = years) 

Z którego można dostać coś

 2012  2013  2014 
     value  value  value 
1  NaN 5.324165 15.747767 
2  NaN -23.193429 9.193217 
3  NaN -14.144287 23.896030 
4  NaN -21.877975 16.310195 
5  NaN -3.079910 -6.093905 
6  NaN -2.106847 -23.253183 
7  NaN 10.644636 6.542562 
8  NaN -9.763087 14.335956 
9  NaN -3.529646 2.607973 
10  NaN -18.633832 0.083575 
11  NaN 10.297902 14.059286 
12 33.95442 13.692435 22.293245 
5

Byłaś blisko:

data.groupby([lambda x: x.year, lambda x: x.time]) 

Również należy ustawić date_time jako indeks, jak w kermit666 „s odpowiedź