如何基于含tripId的GPS坐标DataFrame计算每段行程总距离与时长
行程总距离与总时长计算方案
首先将你已经算好的步长距离合并到原DataFrame中,同时修正每个行程首行的无效步长值:
import pandas as pd # 合并步长距离列 df['distance_K'] = pd.Series(haversine_vector(df, df.shift(),Unit.KILOMETERS), index=df.index) # 每个trip的首行步长是和上一个trip末行计算的无效值,统一置为0 df.loc[df.groupby('tripId').head(1).index, 'distance_K'] = 0
计算单行程总距离
使用pandas分组聚合功能替代你写的for循环,性能更高且不会出现链式赋值问题:
- 如果你需要单独的行程统计结果表:
trip_stats = df.groupby('tripId', as_index=False)['distance_K'].sum().rename(columns={'distance_K': 'total_distance_km'})
- 如果你需要把总距离回写到原DataFrame的每一行,和你原有循环效果一致:
df['total_distance_km'] = df.groupby('tripId')['distance_K'].transform('sum')
计算单行程总时长
首先确保timestamp列为datetime类型,再按tripId分组计算时间差:
# 转换时间列类型(如果已经是datetime类型可以跳过这步) df['timestamp'] = pd.to_datetime(df['timestamp'])
- 单独统计结果写入trip_stats表:
trip_stats['total_duration'] = df.groupby('tripId')['timestamp'].apply(lambda x: x.max() - x.min()).values
- 回写总时长到原DataFrame每一行:
df['total_duration'] = df.groupby('tripId')['timestamp'].transform(lambda x: x.max() - x.min())
如果需要转换时长单位,可使用dt属性处理,例如转换为分钟:
trip_stats['total_duration_min'] = trip_stats['total_duration'].dt.total_seconds() / 60
内容的提问来源于stack exchange,提问作者Hermoine
相关产品推荐
相关产品推荐

