You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按carid分组,基于时间差为时序数据标记trip ID?

按CarID分组生成Trip ID的解决方案

这问题我太熟了!你已经找到了单个CarID下的正确逻辑,现在只需要把这个逻辑按CarID分组应用就可以啦,一步到位。

步骤拆解

  1. 先确保你的timestamp列是datetime类型(如果还没转换的话):
import pandas as pd
df['timestamp'] = pd.to_datetime(df['timestamp'])
  1. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:27:42