汇总到基于15分钟的时间戳到小时,并查找pandas中多列的总和,平均值和最大值

时间:2017-06-28 10:42:51

标签: python pandas timestamp aggregate

我有一个每15分钟有一个period_start_time的数据帧,现在我需要聚合到1小时,并计算数据帧中几乎每列的总和和平均值(它有大约20列)和

    PERIOD_START_TIME       ID      val1     val2
    06.21.2017 22:15:00      12       3        0
    06.21.2017 22:30:00      12       5        6
    06.21.2017 22:45:00      12       0        3
    06.21.2017 23:00:00      12       5        2
    ...
    06.21.2017 22:15:00      15       9        2
    06.21.2017 22:30:00      15       0        2
    06.21.2017 22:45:00      15       1        5
    06.21.2017 23:00:00      15       0        1
    ...

    Desired output: 
   PERIOD_START_TIME        ID    val1(avg) val1(sum) val1(max) ...
   06.21.2017 22:00:00      12      3.25       13         5     
     ...
   06.21.2017 23:00:00      15      2.25       10         9    ...

对于列val2,以及dataframe中的每个其他列。 我不知道如何按时间段开始每小时的分组,而不是一整天,不知道如何开始。

2 个答案:

答案 0 :(得分:4)

我认为Hour需要Series.dt.floor,然后按agg汇总:

df = df.groupby([df['PERIOD_START_TIME'].dt.floor('H'),'ID']).agg(['mean','sum', 'max'])
#for columns from MultiIndex
df.columns = df.columns.map('_'.join)
print (df)
                        val1_mean  val1_sum  val1_max  val2_mean  val2_sum  \
PERIOD_START_TIME   ID                                                       
2017-06-21 22:00:00 12   2.666667         8         5          3         9   
                    15   3.333333        10         9          3         9   
2017-06-21 23:00:00 12   5.000000         5         5          2         2   
                    15   0.000000         0         0          1         1   

                        val2_max  
PERIOD_START_TIME   ID            
2017-06-21 22:00:00 12         6  
                    15         5  
2017-06-21 23:00:00 12         2  
                    15         1  
df = df.reset_index()
print (df)
  PERIOD_START_TIME  ID  val1_mean  val1_sum  val1_max  val2_mean  val2_sum  \
0  2017-06-21 22:00  12   2.666667         8         5          3         9   
1  2017-06-21 22:00  15   3.333333        10         9          3         9   
2  2017-06-21 23:00  12   5.000000         5         5          2         2   
3  2017-06-21 23:00  15   0.000000         0         0          1         1   

   val2_max  
0         6  
1         5  
2         2  
3         1  

答案 1 :(得分:1)

非常相似,您可以将PERIOD_START_TIME转换为pandas Period。

df['PERIOD_START_TIME'] = df['PERIOD_START_TIME'].dt.to_period('H')
df.groupby(['PERIOD_START_TIME', 'ID']).agg(['max', 'min', 'mean']).reset_index()