基于多条件聚合Pandas DataFrame车辆行程数据的方法
合并重叠/间隔过近的车辆行程数据实现方案
核心思路
先按vehicleID和日期分组(限定单日行程处理),对每组内的行程按开始时间排序,通过计算相邻行程的时间间隔标记合并组,最后按车辆和合并组聚合汇总数据。
步骤1:数据预处理
确保时间列是datetime类型,并提取日期用于单日分组:
import pandas as pd # 假设你的数据集包含以下列:vehicleID, start_time, end_time, duration, meters_travelled df['start_time'] = pd.to_datetime(df['start_time']) df['end_time'] = pd.to_datetime(df['end_time']) df['date'] = df['start_time'].dt.date
步骤2:标记合并组
对每个车辆-日期组,排序后计算相邻行程的时间间隔,标记需要合并的行程组:
def mark_merge_groups(group): # 按开始时间升序排序 sorted_group = group.sort_values('start_time').reset_index(drop=True) # 计算当前行程与前一行程的间隔(转换为分钟) sorted_group['interval'] = sorted_group['start_time'].diff().dt.total_seconds() / 60 # 生成合并组ID:间隔≥30分钟时新建组,否则归为上一组 sorted_group['merge_group'] = (sorted_group['interval'] >= 30).cumsum() + 1 # 处理第一个行程的空值(默认归为第1组) sorted_group['merge_group'].fillna(1, inplace=True) return sorted_group # 应用到所有车辆-日期分组 processed_df = df.groupby(['vehicleID', 'date']).apply(mark_merge_groups).reset_index(drop=True)
步骤3:聚合合并后的行程
按车辆、日期和合并组汇总时长与行驶里程,同时保留合并行程的起止时间:
final_result = processed_df.groupby(['vehicleID', 'date', 'merge_group']).agg( merged_start=('start_time', 'min'), merged_end=('end_time', 'max'), total_duration=('duration', 'sum'), total_meters=('meters_travelled', 'sum') ).reset_index()
说明
- 重叠或间隔不足30分钟的行程会被分配到同一个
merge_group,聚合后形成单一行程记录 - 间隔≥30分钟的行程会单独成组,保留独立的汇总结果
- 最终结果包含合并后行程的最早开始时间、最晚结束时间,以及总时长、总行驶里程
内容的提问来源于stack exchange,提问作者Adorable
相关产品推荐
相关产品推荐

