【问题标题】:Pandas Dataframe group by hour of weekPandas Dataframe 按一周的小时分组
【发布时间】:2017-10-11 13:20:42
【问题描述】:

我有一个数据框,其中包含房屋 (ID) 的每小时 kWh 能源消耗 (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 是 type 的索引。我的目标是找出一周内每个小时的平均消耗量和方差,即(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')?

标签: pandas time-series


【解决方案1】:

即使迟到了:我也有类似的问题,我认为上述答案不正确,应该是

df.groupby((df.index.dayofweek) * 24 + (df.index.hour)).mean().rename_axis('HourOfWeek')

在上述答案中,您最终会得到不需要的组合,因为分配的组不是唯一的,例如周一下午 2 点与周二凌晨 1 点等组合在一起

【讨论】:

  • 记住要考虑夏令时的变化:一天有 23 小时和 25 小时有几个星期。 ;) 计算与星期一午夜的时差作为分组依据的变量通常更安全。
【解决方案2】:

我认为您需要groupbydayofweekhour,但需要添加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

【讨论】:

  • @fabhof 的答案应该是正确的,而这确实是错误的。
猜你喜欢
  • 2018-09-04
  • 1970-01-01
  • 2017-02-26
  • 2017-02-28
  • 2019-08-08
  • 2021-10-15
  • 2018-06-20
  • 2018-09-04
相关资源
最近更新 更多