如何按carid分组,基于时间差为时序数据标记trip ID?
按CarID分组生成Trip ID的解决方案
这问题我太熟了!你已经找到了单个CarID下的正确逻辑,现在只需要把这个逻辑按CarID分组应用就可以啦,一步到位。
步骤拆解
- 先确保你的
timestamp列是datetime类型(如果还没转换的话):
import pandas as pd df['timestamp'] = pd.to_datetime(df['timestamp'])
- 用
groupby按carid分组,对每个组单独计算时间差标记并累加生成Trip ID:
# 用秒数判断更直观,推荐这个写法 df['trip_id'] = df.groupby('carid')['timestamp'].apply( lambda x: (x.diff().dt.total_seconds() > 5).astype(int).cumsum() ) # 如果你习惯用纳秒判断,也可以保留你原来的逻辑: # df['trip_id'] = df.groupby('carid')['timestamp'].apply( # lambda x: (x.diff().astype(int) > 5000000000).astype(int).cumsum() # )
效果说明
- 每个
carid组内的第一条数据,因为没有前一行,diff()结果是NaN,判断后为False,所以trip_id从0开始。 - 当当前行和前一行的时间差超过5秒时,标记为1,累加后
trip_id会自动递增,同一连续时间区间内的行共享同一个trip_id。 - 如果想要全局唯一的Trip ID(避免不同CarID的Trip ID重复),可以把CarID和组内ID拼接起来:
df['trip_id'] = df['carid'].astype(str) + "_" + df['trip_id'].astype(str)
测试你的示例数据
拿你给出的样本来说,第5行(索引5)的时间是2017-07-18 03:46:40,第6行是2017-07-19 03:46:45,时间差远大于5秒,所以第6行的trip_id会从之前的0变成1,完美符合你的需求!
内容的提问来源于stack exchange,提问作者retorquere
相关产品推荐
相关产品推荐

