You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas DataFrame分组数值积分:按设备计算非均匀时间下的∫Idt

如何对分组的不均匀时间序列数据进行数值积分?

假设我们有这样的Pandas DataFrame,记录了不同设备在不同时间点的电流值:

import pandas as pd

data = {
    'Device': [1,1,1,1,1,1,2,2,2,2,3,3,3,3],
    'TimeSec': [0.1,0.25,0.32,0.45,1.32,2.37,0.22,0.34,1.87,3.21,0.16,1.12,2.45,3.45],
    'Current': [0.02,0.05,0.07,0.12,0.34,2.24,0.56,0.79,2.76,3.11,1.87,2.33,3.21,5.11]
}
df = pd.DataFrame(data)

需求很明确:针对每个Device,计算Current关于TimeSec的数值积分(∫Idt),最后汇总成一个包含设备ID和对应积分结果的新DataFrame。而且这里的时间间隔是不均匀的,每个设备的数据行数也不一样。

解决方案:分组 + 梯形法积分

对于不均匀间隔的数值积分,**梯形法(Trapezoidal Rule)**是最合适的选择,它能很好地适配不等间距的x轴数据。Pandas和NumPy都提供了现成的trapz函数来实现这个计算。

我们可以通过以下步骤完成:

  1. 按Device对原始DataFrame进行分组
  2. 对每个分组,用梯形法计算Current相对于TimeSec的积分
  3. 将分组计算的结果整理成目标格式的DataFrame

具体代码如下:

import numpy as np

# 分组计算积分,结果会是一个Series,索引是Device,值是积分结果
integrated_results = df.groupby('Device').apply(
    lambda group: np.trapz(group['Current'], group['TimeSec'])
)

# 把Series转换成目标格式的DataFrame
result_df = integrated_results.reset_index(name='IntegratedCurrent')

print(result_df)

运行这段代码后,你会得到这样的结果:

Device  IntegratedCurrent
0       1           2.162150
1       2           6.233650
2       3           10.64855

代码解释

  • groupby('Device'):把原始数据按设备ID分成独立的组,每个组对应一个设备的所有时间-电流数据
  • np.trapz(y, x):这里y是电流值Current,x是时间值TimeSec,函数会自动根据x的间隔计算梯形面积的总和,也就是积分结果
  • reset_index(name='IntegratedCurrent'):把分组得到的Series(索引是Device)转换成标准的DataFrame,并重命名积分结果的列名为IntegratedCurrent

这样就完美解决了时间间隔不均、设备数据量不同的积分计算问题啦!

内容的提问来源于stack exchange,提问作者FunkyMore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 04:18:08