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

如何在时间序列中断时重置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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 15:29:11