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函数来实现这个计算。
我们可以通过以下步骤完成:
- 按
Device对原始DataFrame进行分组 - 对每个分组,用梯形法计算
Current相对于TimeSec的积分 - 将分组计算的结果整理成目标格式的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
相关产品推荐
相关产品推荐

