2017-03-06 1 views
3

Je travaille sur un code qui prend des données horaires pour un mois et les regroupe en sommes de 24 heures. Mon problème est que je voudrais que l'index lise la date/année et je reçois juste un index de 1-30.Pandas groupe données horaires en sommes journalières avec index date

Le code J'utilise est

df = df.iloc[:,16:27].groupby([lambda x: x.day]).sum() 

exemple de sortie Je reçois

DateTime  data 
1   1772.031568 
2   19884.42243 
3   28696.72159 
4   24906.20355 
5   9059.120325 

exemple de sortie Je voudrais

DateTime  data 
1/1/2017  1772.031568 
1/2/2017  19884.42243 
1/3/2017  28696.72159 
1/4/2017  24906.20355 
1/5/2017  9059.120325 

Répondre

2

Si votre index est un datetime, vous pouvez construire une combinaison groupby clause:

df = df.iloc[:,16:27].groupby([lambda x: "{}/{}/{}".format(x.day, x.month, x.year)]).sum() 

ou mieux encore:

df = df.iloc[:,16:27].groupby([lambda x: x.strftime("%d%m%Y")]).sum() 
+0

deuxième fait exactement ce dont j'ai besoin. Je vous remercie. – acb

+0

Juste pour l'enregistrement, je vous recommande de définir le jeton 'groupby' comme'% Y% m% d', car il est ainsi plus facile d'obtenir les éléments classés par date (si vous en avez besoin). –

0

Vous pouvez exploiter DatetimeIndex panda:

working_df=df.iloc[:, 16:27] 
result = working_df.groupby(pd.DatetimeIndex(working_df.DateTime)).date).sum() 

Ce si la colonne DateTime est en fait DateTime (et faites attention au fuseau horaire).

De cette façon, vous aurez un datetime valide dans l'index, de sorte que vous pouvez facilement faire d'autres manipulations.

1

si votre index n'était pas un objet datetime.

import pandas as pd 
df = pd.DataFrame({'data': [1772.031568, 19884.42243,28696.72159, 24906.20355,9059.120325]},index=[1,2,3,4,5]) 
print df.head() 
rng = pd.date_range('1/1/2017',periods =len(df.index), freq='D') 
df.set_index(rng,inplace=True) 
print df.head() 

se traduira par

  data 
1 1772.031568 
2 19884.422430 
3 28696.721590 
4 24906.203550 
5 9059.120325 
        data 
2017-01-01 1772.031568 
2017-01-02 19884.422430 
2017-01-03 28696.721590 
2017-01-04 24906.203550 
2017-01-05 9059.120325 
1

D'abord, vous devez créer un index sur votre colonne datetime pour exposer les fonctions qui rompent la datetime en petits morceaux efficacement (comme l'année et le mois de l'datetime). Ensuite, vous devez regrouper par année, mois et jour si vous souhaitez appliquer une méthode agrégée (telle que sum()) à chaque jour de l'année et conserver des agrégations distinctes pour chaque jour.

Les fonctions permettent reset_index() et rename() pour rebaptiser nos group_by catégories à leur nom d'origine. Cela "aplatit" nos données, faisant de la catégorie une colonne réelle sur la base de données résultante.

import pandas as pd 

date_index = pd.DatetimeIndex(df.created_at) 
# 'df.created_at' is the datetime column in your dataframe 
counted = df.group_by([date_index.year, date_index.month, date_index.day])\ 
      .agg({'column_to_sum': 'sum'})\ 
      .reset_index()\ 
      .rename(columns={'level_1': 'year', 
          'level_2': 'month', 
          'level_3': 'day'}) 

# Resulting dataframe has columns "column_to_sum", "year", "month", "day" available