如何在时间序列中断时重置DataFrame的SEQ序列
为DataFrame添加按时间连续性重置的SEQ列
没问题,我来帮你实现这个需求。这里有个基于pandas的完整解决方案,完全匹配你要的规则:
首先,先把你的示例数据转换成可操作的DataFrame(方便你直接测试):
import pandas as pd data = { 'ID': [10789890, 10778370, 10778882, 10783746, 10783746, 10780162, 10780418, 10777346, 10779394, 10782210, 10781186, 10776834, 10788866, 10788354, 10783746, 10788866, 10781442, 10788354, 10789890, 10782210, 10793986, 10780162, 10778882, 10789890, 10788354, 10783746], 'Time': ['13:04:10', '13:04:11', '13:04:12', '13:04:14', '13:04:15', '13:04:15', '13:04:15', '13:04:15', '13:04:15', '13:04:15', '13:04:15', '13:04:15', '13:04:15', '13:04:15', '13:04:16', '13:04:16', '13:04:16', '13:04:16', '13:04:16', '13:04:16', '13:04:16', '13:04:16', '13:04:16', '13:04:18', '13:04:18', '13:04:18'] } df = pd.DataFrame(data)
接下来执行核心逻辑,生成SEQ列:
# 1. 把Time字符串转成datetime类型,方便计算时间差 df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S') # 2. 计算当前行和上一行的时间差(单位:秒) df['time_diff'] = df['Time'].diff().dt.total_seconds() # 3. 标记序列分组:只要时间差不是1秒,就视为新序列的开始,用cumsum生成分组ID df['seq_group'] = (df['time_diff'] != 1).cumsum() # 4. 每个分组内从1开始递增计数,得到SEQ列 df['SEQ'] = df.groupby('seq_group').cumcount() + 1 # 5. 可选:删掉中间的辅助列,让结果更整洁 df = df.drop(['time_diff', 'seq_group'], axis=1)
运行后你就能得到和期望完全一致的结果:
ID Time SEQ 0 10789890 1900-01-01 13:04:10 1 1 10778370 1900-01-01 13:04:11 2 2 10778882 1900-01-01 13:04:12 3 3 10783746 1900-01-01 13:04:14 1 4 10783746 1900-01-01 13:04:15 2 5 10780162 1900-01-01 13:04:15 3 6 10780418 1900-01-01 13:04:15 4 7 10777346 1900-01-01 13:04:15 5 8 10779394 1900-01-01 13:04:15 6 9 10782210 1900-01-01 13:04:15 7 10 10781186 1900-01-01 13:04:15 8 11 10776834 1900-01-01 13:04:15 9 12 10788866 1900-01-01 13:04:15 10 13 10788354 1900-01-01 13:04:15 11 14 10783746 1900-01-01 13:04:16 12 15 10788866 1900-01-01 13:04:16 13 16 10781442 1900-01-01 13:04:16 14 17 10788354 1900-01-01 13:04:16 15 18 10789890 1900-01-01 13:04:16 16 19 10782210 1900-01-01 13:04:16 17 20 10793986 1900-01-01 13:04:16 18 21 10780162 1900-01-01 13:04:16 19 22 10778882 1900-01-01 13:04:16 20 23 10789890 1900-01-01 13:04:18 1 24 10788354 1900-01-01 13:04:18 2 25 10783746 1900-01-01 13:04:18 3
简单解释下每一步的作用:
- 转换时间类型:字符串没法直接算时间差,转成datetime类型后才能进行时间运算。
- 计算时间差:用
diff()获取相邻行的时间间隔,转成秒数后,就能轻松判断是否连续(连续的话时间差应该是1秒)。 - 生成序列分组:只要时间差不是1秒,就标记为一个新的分组起点,
cumsum()会给每个连续时间段分配唯一的分组ID。 - 分组计数:对每个分组用
cumcount()从0开始计数,加1后就得到了你要的从1开始递增的SEQ序列。 - 清理辅助列:如果不需要中间的
time_diff和seq_group,删掉它们就好了。
内容的提问来源于stack exchange,提问作者Rohit Lamba
相关产品推荐
相关产品推荐

