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

Pandas如何基于timestamp与经纬度计算相邻行速度并新增列

pandas计算相邻轨迹点移动速度实现方案

核心思路

rolling.apply单序列处理限制、shift后直接传参类型不匹配是这类需求的常见坑,不需要修改原有自定义距离函数,通过shift对齐相邻行数据+逐行按要求格式传参的方式即可快速实现,无额外依赖。

前置说明

假设你已有的经纬度距离计算函数名为calc_distance,入参要求为两个形如(纬度, 经度)的元组,返回值单位为米;示例数据里的timestamp是毫秒级时间戳,计算时会转成秒,最终输出速度单位为m/s,如果需要km/h的结果,直接把速度值乘3.6即可。

实现步骤

  • 第一步:生成偏移列,把上一行的时间戳、经纬度对齐到当前行
import pandas as pd

# 生成上一行数据的偏移列
df['prev_ts'] = df['timestamp'].shift(1)
df['prev_lat'] = df['latitude'].shift(1)
df['prev_lon'] = df['longitude'].shift(1)
  • 第二步:逐行计算速度,直接复用你已有的距离函数
def get_speed(row, dist_calc_func):
    # 首行没有前序点,返回空值
    if pd.isna(row['prev_ts']):
        return None
    # 按距离函数要求组装两个坐标元组
    point_prev = (row['prev_lat'], row['prev_lon'])
    point_curr = (row['latitude'], row['longitude'])
    # 计算两点间距
    distance = dist_calc_func(point_prev, point_curr)
    # 计算时间差,毫秒转秒,如果你的timestamp是秒级就去掉/1000
    time_gap = (row['timestamp'] - row['prev_ts']) / 1000
    return distance / time_gap

# 传入你自己的距离函数,生成速度列
df['speed'] = df.apply(get_speed, axis=1, dist_calc_func=calc_distance)
  • 第三步:清理中间生成的冗余偏移列(可选)
df = df.drop(columns=['prev_ts', 'prev_lat', 'prev_lon'])

常见踩坑原因

  • rolling.apply默认仅支持单列滚动计算:即使设置window=2,每次传入函数的也只是单个字段的两个值,无法同时获取经纬度两个维度的坐标,适配多列的写法复杂度远高于shift方案。
  • shift后直接传参报错:你的自定义距离函数仅接受两个经纬度元组作为入参,没有做DataFrame类型的入参适配,逐行组装坐标元组后再传参即可解决类型不匹配问题。

结果说明

处理完成后DataFrame会新增speed列,首行因为没有前序点值为NaN,其余行均为对应相邻两点间的移动速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:51:22