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
相关产品推荐
相关产品推荐

