首页 > 解决方案 > 使用时间索引计算特定时间间隔(例如每天)的 Pandas DataFrame 列的积分

问题描述

我有一个数据框 (df),其中包含一年的功率传感器数据。数据以不规则的频率采样。我的 df 类似于:

rng = pd.date_range('2020-07-30 12:00:00', periods=24, freq='6H')  
df = pd.DataFrame(np.array([1, 4, 5, 2, 1, 6, 1, 4, 5, 2, 1, 6, 1, 4, 5, 2, 1, 6, 1, 4, 5, 2, 1, 6]), rng, columns=['power'])  
df.index.name = 'Date'
df["month"] = df.index.month
df["week"] = df.index.week 

我想要做的是计算每天的积分,然后能够总结不同持续时间的积分,例如每周、每月等。

对于整个数据框,以下给出正确答案(他们考虑 x 轴上的时间):

np.trapz(df["power"], df.index, axis=0)/np.timedelta64(1, 'h')

或者

df.apply(integrate.trapz, args=(df.index,))/np.timedelta64(1, 'h')

当我尝试每天整合时,我尝试过:

df.groupby(df.index.date)["power"].apply(np.trapz)

它有两个问题:

  1. 它假设“功率”测量是等距的,并且是每 1 个时间单位
  2. 当一天发生变化时,它不考虑第一个时间单位的贡献(例如,在 2020 年 7 月 31 日,该值应该是 13,但现在计算为 8.5

我也试过:

df.groupby(df.index.date)["power"].apply(integrate.trapz, args=(df.index,))

但我得到: TypeError: trapz() got an unexpected keyword argument 'args'

我希望我的结果看起来像:

Date           Energy(kWh)
2020-07-30     15
2020-07-31     78
2020-08-01     84
2020-08-02     66
2020-08-03     78
2020-08-04     84
2020-08-05     30

然后能够分组例如

df = df.groupby(["month", "week"])["power"].sum()

结果如下:

month  week    Energy(kWh)
7      31      93
8      31      150
       32      192

那么如何在集成中使用我的初始数据帧的索引呢?

标签: pandas

解决方案


推荐阅读