2013-03-08 4 views
15

J'ai les données de 15 minutes suivantes comme dataframe pour 3 ans. Avec les deux premières colonnes étant l'index.Comment puis-je diviser des valeurs uniques d'une base de données par des moyennes mensuelles?

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  

Je l'ai utilisé resample pour obtenir une deuxième série avec des moyennes mensuelles.

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

Comment puis-je diviser les valeurs dans la dernière colonne par leur moyenne mensuelle avec le résultat étant encore une série chronologique sur granularité de 15 minutes?

Répondre

21

d'abord un mérou:

import pandas as pd 

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

puis faites votre nouvelle colonne:

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

En passant mérou à la méthode groupby vous de regrouper vos données en un seul mois de morceaux. Dans chaque segment, vous divisez la référence d'intervalle de 15 minutes par la moyenne pour ce mois.

3

Je pense qu'il est généralement recommandé d'utiliser Grouper au lieu de TimeGrouper. Jetez un oeil à this. Par exemple, si votre colonne est appelée date, utilisez

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

au lieu d'utiliser TimeGrouper et continuer comme suggéré @ Zelazny7. Si votre colonne n'est pas un indice de datetime puis utilisez

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

Cela peut être fait en une ligne avec:

df.groupby([df.index.year, df.index.month]).transform(lambda x: x/x.mean()) 
Questions connexes