如何在DataFrame中计算截至某点的曲线下面积以求解瞬时速度
解决方法
要计算每个时间点的瞬时速度(本质是加速度对时间的累计积分),给你两个实用的实现方式:
方法1:手动计算梯形面积并累加
速度是加速度随时间的积分,用梯形法近似每个时间区间的积分值,再累加这些值就能得到截至当前时间点的速度:
- 计算相邻时间点的时间差
- 用梯形公式算每个区间的积分:
(当前加速度 + 前一加速度)/2 × 时间差 - 累加区间积分,得到每个时间点的累计速度(默认初始速度为0)
代码示例:
import pandas as pd import numpy as np # 假设你的DataFrame是data,包含'time'和'zAccel'列 data['time_diff'] = data['time'].diff() # 初始行的时间差为NaN,填充为0避免计算错误 data['interval_area'] = (data['zAccel'] + data['zAccel'].shift(1)) / 2 * data['time_diff'].fillna(0) # 累加得到累计速度 data['z_velocity'] = data['interval_area'].cumsum()
方法2:用scipy的累计积分函数
scipy.integrate.cumtrapz专门用于计算累计梯形积分,省去手动写逻辑的麻烦。注意这个函数返回的结果比输入少一个元素(对应每个区间的积分),需要在前面补一个0作为初始速度:
代码示例:
from scipy.integrate import cumtrapz # 计算累计积分并补初始速度0 data['z_velocity'] = np.concatenate([[0], cumtrapz(y=data['zAccel'], x=data['time'])])
原代码的问题
numpy.trapz(x=df[time], y=df[zAccel])只会计算整个加速度曲线下的总面积,返回单个数值,所以赋值给z_velocity列时,整列都是同一个总速度,自然得不到每个时间点的累计结果。另外直接用“加速度×时间”的思路错误,因为加速度是随时间变化的,不能用瞬时加速度直接乘时间,必须通过积分(或梯形累加)计算速度变化量。
内容的提问来源于stack exchange,提问作者palor
相关产品推荐
相关产品推荐

