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

如何在DataFrame中计算截至某点的曲线下面积以求解瞬时速度

解决方法

要计算每个时间点的瞬时速度(本质是加速度对时间的累计积分),给你两个实用的实现方式:


方法1:手动计算梯形面积并累加

速度是加速度随时间的积分,用梯形法近似每个时间区间的积分值,再累加这些值就能得到截至当前时间点的速度:

  1. 计算相邻时间点的时间差
  2. 用梯形公式算每个区间的积分:(当前加速度 + 前一加速度)/2 × 时间差
  3. 累加区间积分,得到每个时间点的累计速度(默认初始速度为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 02:20:02