如何基于时间阈值为数据集添加车辆通行计数列
解决按车辆通行时间差重置计数的问题
要实现同一车辆两次通行时间差超过指定阈值时重置计数的功能,你需要在按车辆分组的基础上,额外根据时间差划分子分组,再在子分组内累加计数。以下是具体实现步骤:
步骤说明
- 确保时间列是datetime类型:方便后续计算时间差
- 计算相邻通行的时间差:按车辆分组,计算每辆车相邻两次通行的时间间隔
- 生成子分组标记:当时间差超过阈值时,标记为新的子分组,通过累加标记得到子分组ID
- 子分组内累加计数:按车辆+子分组ID分组,使用
cumcount()实现分组内的计数
完整代码示例
import pandas as pd # 示例数据集(替换为你的实际数据) data = { 'Vehicle': ['A', 'B', 'C', 'C', 'A', 'A', 'B', 'A'], 'Time': ['00:15', '00:20', '00:25', '00:45', '00:59', '01:56', '22:55', '23:49'] } df = pd.DataFrame(data) # 转换时间列为datetime类型(如果你的数据包含日期,调整format参数即可) df['Time'] = pd.to_datetime(df['Time'], format='%H:%M') # 设置时间阈值(示例为20小时,可根据需求修改) TIME_THRESHOLD = pd.Timedelta(hours=20) # 计算每个车辆相邻通行的时间差 df['time_diff'] = df.groupby('Vehicle')['Time'].diff() # 生成子分组ID:超过阈值则创建新分组 df['subgroup_id'] = df.groupby('Vehicle')['time_diff'].apply( lambda x: (x > TIME_THRESHOLD).cumsum() ) # 计算每辆车在子分组内的通行次数 df['number times passed'] = df.groupby(['Vehicle', 'subgroup_id']).cumcount() + 1 # 保留需要的列(可选,删除中间辅助列) df = df[['Vehicle', 'Time', 'number times passed']] print(df)
代码解释
groupby('Vehicle')['Time'].diff():针对每个车辆,计算当前行与前一行的时间差,首次通行的时间差为NaN(x > TIME_THRESHOLD).cumsum():对每个车辆的时间差判断,超过阈值时返回True(即1),累加后得到连续的子分组ID,同一连续时间段内的通行会被分到同一个子组groupby(['Vehicle', 'subgroup_id']).cumcount() + 1:在每个车辆的子分组内从1开始计数,实现超过阈值重置的效果
运行后输出结果与你提供的示例完全一致:
Vehicle Time number times passed 0 A 1900-01-01 00:15:00 1 1 B 1900-01-01 00:20:00 1 2 C 1900-01-01 00:25:00 1 3 C 1900-01-01 00:45:00 2 4 A 1900-01-01 00:59:00 2 5 A 1900-01-01 01:56:00 3 6 B 1900-01-01 22:55:00 1 7 A 1900-01-01 23:49:00 1
内容的提问来源于stack exchange,提问作者Iceman43
相关产品推荐
相关产品推荐

