2013-03-08 16 views
15

Mam następujące 15 minut danych jako dataframe przez 3 lata. Z pierwszymi dwoma kolumnami będącymi indeksem.Jak mogę podzielić pojedyncze wartości ramki danych według średnich miesięcznych?

2014-01-01 00:15:00 1269.6  
2014-01-01 00:30:00 1161.6  
2014-01-01 00:45:00 1466.4  
2014-01-01 01:00:00 1365.6  
2014-01-01 01:15:00 1362.6  
2014-01-01 01:30:00 1064.0  
2014-01-01 01:45:00 1171.2  
2014-01-01 02:00:00 1171.0  
2014-01-01 02:15:00 1330.4  
2014-01-01 02:30:00 1309.6  
2014-01-01 02:45:00 1308.4  
2014-01-01 03:00:00 1494.0  

Użyłem resample, aby uzyskać drugą serię ze średnimi miesięcznymi.

data_Monthly = data.resample('1M', how='mean') 

Jak mogę podzielić wartości w ostatniej kolumnie ich miesięcznej średniej z wynikiem będąc jeszcze seria czas na 15 minut ziarnistości?

Odpowiedz

21

najpierw zaciągnąć granika:

import pandas as pd 

In [1]: grouper = pd.TimeGrouper("1M") 

Następnie zrób nową kolumnę:

In [2]: df['normed'] = df.groupby(grouper).transform(lambda x: x/x.mean()) 

Przekazując granika metody grupowania danych groupby na jeden miesiąc kawałki. W obrębie każdej porcji dzieli się 15-minutowy okres odniesienia przez średnią dla tego miesiąca.

3

Myślę, że generalnie zaleca się używanie Grouper zamiast TimeGrouper. Spójrz na this. Na przykład, jeśli kolumna nazywa Data użyć

grouper = pd.Grouper(key='Date', freq='M') 

zamiast korzystania TimeGrouper a następnie kontynuować @ zasugerował Zelazny7. Jeśli kolumna nie jest indeksem datetime następnie użyć

df['Date'] = pd.to_datetime(df['Date']) 
0

Można to zrobić w jednej linii z:

df.groupby([df.index.year, df.index.month]).transform(lambda x: x/x.mean()) 
Powiązane problemy