使用pandas识别短间隔拆分行程 实现用户出行次数精确统计
实现思路
核心逻辑是按用户维度对行程排序后,通过相邻行程的时间间隔切分独立出行,给每段独立出行分配唯一标识,后续所有统计基于唯一标识去重即可,从根源避免拆分行程重复计数。
具体实现步骤
- 先将时间字段转换为pandas原生datetime类型,为时间差计算做准备
- 按用户ID、行程开始时间升序排序,修正原始数据可能存在的行程顺序错乱问题
- 按用户分组,计算当前行程的开始时间与同用户上一段行程结束时间的间隔
- 标记独立出行起点:用户的第一条行程、与上一段行程间隔≥20分钟的行程,均记为新的独立出行起点
- 为每段独立出行生成全局唯一ID,作为后续统计的去重依据
import pandas as pd # 构造/读取数据集 df = pd.DataFrame({ 'user': [62,62,62,62,62,62,62,62,62], 'start': ['2008-06-20 04:21:40','2008-06-20 05:40:31','2008-06-21 04:23:39', '2008-06-21 04:47:53','2008-07-13 05:45:27','2008-07-13 06:47:57', '2008-07-14 09:08:06','2008-07-14 13:12:46','2008-07-14 13:24:23'], 'end': ['2008-06-20 05:33:46','2008-06-20 05:53:11','2008-06-21 04:35:15', '2008-06-21 05:43:20','2008-07-13 06:02:54','2008-07-13 07:20:19', '2008-07-14 09:17:15','2008-07-14 13:20:10','2008-07-14 13:30:43'], 'mode': ['bus','walk','bus','bus','bus','bus','taxi','bus','bus'] }) # 转换时间字段类型 df['start'] = pd.to_datetime(df['start']) df['end'] = pd.to_datetime(df['end']) # 按用户、行程开始时间排序 df = df.sort_values(by=['user', 'start']).reset_index(drop=True) # 计算同用户相邻两段行程的时间间隔 df['time_gap'] = df['start'] - df.groupby('user')['end'].shift(1) # 标记独立出行起点 df['is_new_trip'] = (df['time_gap'].isna()) | (df['time_gap'] >= pd.Timedelta(minutes=20)) # 生成独立出行ID df['trip_id'] = df.groupby('user')['is_new_trip'].cumsum() df['global_trip_id'] = df['user'].astype(str) + '_' + df['trip_id'].astype(str)
结果验证
代码运行后,示例数据中用户62的9条记录会被标记为6个独立出行ID,和预期结果一致。处理后新增字段含义如下:
time_gap:与上一段同用户行程的时间间隔is_new_trip:是否为独立出行的起点trip_id:用户维度下的独立出行编号global_trip_id:全局唯一的独立出行ID
常用统计操作
- 统计全量独立出行总次数:
df['global_trip_id'].nunique() - 按用户统计各自的出行次数:
df.groupby('user')['global_trip_id'].nunique() - 统计指定时段内的出行次数:先筛选出时段覆盖的行程记录,再对
global_trip_id去重计数即可,注意不要直接统计筛选后的行数,避免跨时段的同一次出行被重复计数 - 提取单次独立出行的汇总特征:按
global_trip_id分组聚合,比如取组内最小start作为出行开始时间、最大end作为出行结束时间、收集所有mode值作为本次出行的换乘交通方式列表
排序步骤不可省略,若原始数据中同用户的行程未按时间顺序排列,直接计算相邻时间差会得到完全错误的切分结果。该方法对海量数据友好,pandas可高效支持百万级行程记录的切分计算。
内容的提问来源于stack exchange,提问作者user12587364
相关产品推荐
相关产品推荐

