按周小时分组的Pandas数据框。

3
我有一个数据框,其中包含房屋(ID)每小时的千瓦时能耗(Consumption),持续几个月,例如:
                      ID  Consumption
DateTime                              
2016-07-01 01:00:00  1642     0.703400
2016-07-01 02:00:00  1642     0.724033
2016-07-01 03:00:00  1642     0.747300
2016-07-01 04:00:00  1642     0.830450
2016-07-01 05:00:00  1642     0.704917
2016-07-01 06:00:00  1642     0.708467
2016-07-01 07:00:00  1642     0.806533
2016-07-01 08:00:00  1642     0.774483
2016-07-01 09:00:00  1642     0.724833
2016-07-01 10:00:00  1642     0.721900
2016-07-01 11:00:00  1642     0.729450
2016-07-01 12:00:00  1642     0.757233
2016-07-01 13:00:00  1642     0.744667

这里的DateTime是类型的索引。我的目标是找到一周中每个小时的平均消耗和方差,即(24*7 = 168小时)。

HourOfWeek    Consumption
1             0.703400
2             0.724033
...
168           0.876923

我已经尝试过

print (df.groupby(df.index.week)['Consumption'].transform('mean'))

然而这并不能得到正确的结果,如何在pandas中实现?任何帮助将不胜感激。


df.groupby(df.index.dayofweek * df.index.hour)['Consumption'].transform('mean')df.groupby(df.index.dayofweek * df.index.hour)['Consumption'].transform('mean') 是什么意思? - Zero
2个回答

7
即使有点晚了:我遇到过类似的问题,但我不认为上面的答案是正确的,应该是这样的。
df.groupby((df.index.dayofweek) * 24 + (df.index.hour)).mean().rename_axis('HourOfWeek')

在上述答案中,由于分配的组不是唯一的,所以最终会得到不需要的组合,例如:星期一下午2点与星期二上午1点被分成同一组,依此类推。

请记得考虑夏令时的变化:一天中有23小时和25小时的那几周。 ;) 通常更安全的做法是将时间差从周一午夜开始计算,作为分组的变量。 - Dr_Zaszuś

0

我认为你需要使用 dayofweekhour 进行 groupby,但需要加上 1,因为两者的第一个值都是 0。然后进行 mean 聚合:

df1 = (df.groupby((df.index.dayofweek + 1) * (df.index.hour + 1))['Consumption'].mean()
        .rename_axis('HourOfWeek')
        .reset_index())
print (df1)
    HourOfWeek  Consumption
0           10     0.703400
1           15     0.724033
2           20     0.747300
3           25     0.830450
4           30     0.704917
5           35     0.708467
6           40     0.806533
7           45     0.774483
8           50     0.724833
9           55     0.721900
10          60     0.729450
11          65     0.757233
12          70     0.744667

4
@fabhof的答案应该是正确的,而这个确实是错误的。 - Marcus V.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接