基于时间频率分组创建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
相关产品推荐
相关产品推荐

