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

基于时间频率分组创建ID列:同天间隔超5小时需拆分ID

解决方案

步骤1:转换日期格式并提取日期分组依据

首先将字符串格式的Date列转为pandas可计算的datetime类型,同时提取纯日期部分作为分组基础:

import pandas as pd

df = pd.DataFrame({
    'Date': ['22/07/2022 7:37:59', '22/07/2022 7:40:51', '23/07/2022 8:37:59', '23/07/2022 12:22:00', '24/07/2022 7:15:59', '24/07/2022 9:16:59', '24/07/2022 15:00:02', '24/07/2022 15:24:10'],
    'Name': ['Josh', 'Hayden', 'George', 'Josh', 'Peter', 'Josh', 'Hayden', 'Peter']
})

# 转换为datetime类型,匹配输入的日期格式
df['Date'] = pd.to_datetime(df['Date'], format='%d/%m/%Y %H:%M:%S')
# 提取纯日期,用于按天分组
df['date_group'] = df['Date'].dt.date

步骤2:标记同一天内的新分组

对每个日期组,计算当前记录与上一条记录的时间差,当差值超过5小时时标记为新分组起点,再通过累加标记得到组内的子分组ID:

# 计算相邻记录的时间差(秒),第一条记录无前置数据,填充为0
df['time_diff'] = df.groupby('date_group')['Date'].diff().dt.total_seconds().fillna(0)
# 判断时间差是否超过5小时(5*3600秒),是则标记为1,否则为0
df['new_group'] = (df['time_diff'] > 5*3600).astype(int)
# 按日期组累加标记,得到组内的子分组ID
df['sub_id'] = df.groupby('date_group')['new_group'].cumsum()

步骤3:生成全局连续ID

将日期组和子分组ID组合成唯一标识,再通过factorize()生成全局连续的ID:

# 拼接唯一分组键
df['unique_key'] = df['date_group'].astype(str) + '_' + df['sub_id'].astype(str)
# 生成从1开始的连续ID
df['ID'] = pd.factorize(df['unique_key'])[0] + 1
# 清理临时辅助列
df = df.drop(['date_group', 'time_diff', 'new_group', 'sub_id', 'unique_key'], axis=1)

最终结果

运行代码后得到符合要求的DataFrame:

Date    Name  ID
0 2022-07-22 07:37:59    Josh   1
1 2022-07-22 07:40:51  Hayden   1
2 2022-07-23 08:37:59  George   2
3 2022-07-23 12:22:00    Josh   2
4 2022-07-24 07:15:59   Peter   3
5 2022-07-24 09:16:59    Josh   3
6 2022-07-24 15:00:02  Hayden   4
7 2022-07-24 15:24:10   Peter   4

内容的提问来源于stack exchange,提问作者nokvk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:54:18