pandas - 使用时间索引计算特定时间间隔(例如每天)的 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 个时间单位
- 当一天发生变化时,它不考虑第一个时间单位的贡献(例如,在 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
那么如何在集成中使用我的初始数据帧的索引呢?
解决方案
推荐阅读
- android-emulator - Android Studio:客户端尚未准备好...等待进程出现在设备上超时
- python - 合并两个排序的链表python
- javascript - 如何导出 XMLHttpRequest 结果以做出本机反应?
- routing - 路径路由的 AWS 负载均衡器 404 错误
- php - 将数据传递给集合类型 symfony 中的子表单
- c# - NLog.Web.AspNetCore 不再记录到数据库
- node.js - 即使在 Angular 7 中使用编译器选项作为目标 es6 和 es2017,如何修复编译时错误?
- c# - 从单个数据表 c# 填充嵌套的类列表
- javascript - 单击项目名称时打开/关闭子菜单
- python-3.x - 对字典进行排序