如何基于不同行同名记录的起止时间差聚合时间序列数据
实现思路
- 第一步:将所有记录按
Name字段分组,不同名称的记录互不干涉 - 第二步:对每个分组内的记录按
startTime升序排序,保证时间顺序正确 - 第三步:遍历排序后的分组记录,判断相邻两条是否符合合并条件:当前记录的
startTime与上一条记录的endTime差值≤1小时,符合则合并,不符合则新增一条记录 - 第四步:每个合并后的分组保留组内最早的
startTime、最晚的endTime以及对应的Name,最终汇总所有合并结果得到目标表
代码实现
首先确保已经安装pandas库,未安装可以执行命令pip install pandas。
import pandas as pd # 1. 读取数据,这里用示例数据演示,你可以替换为pd.read_csv()/pd.read_excel()读取你的本地文件 df = pd.DataFrame({ 'Name': ['A', 'A', 'A', 'B', 'B', 'C'], 'startTime': ['2024-05-01 08:00:00', '2024-05-01 09:30:00', '2024-05-01 12:00:00', '2024-05-01 10:00:00', '2024-05-01 10:40:00', '2024-05-01 14:00:00'], 'endTime': ['2024-05-01 09:10:00', '2024-05-01 11:20:00', '2024-05-01 13:00:00', '2024-05-01 10:30:00', '2024-05-01 11:30:00', '2024-05-01 15:00:00'] }) # 2. 转换时间字段为datetime类型,才能计算时间差值 # 如果你的时间格式不是标准的YYYY-MM-DD HH:MM:SS,可以加format参数指定,比如format='%d/%m/%Y %H:%M' df['startTime'] = pd.to_datetime(df['startTime']) df['endTime'] = pd.to_datetime(df['endTime']) # 3. 按名称分组,每组内按开始时间升序排序 df = df.sort_values(by=['Name', 'startTime']).reset_index(drop=True) # 4. 定义分组合并逻辑 def merge_continuous_records(group): merged_list = [] for record in group.itertuples(): if not merged_list: # 第一条记录直接加入结果 merged_list.append({ 'Name': record.Name, 'startTime': record.startTime, 'endTime': record.endTime }) else: last_record = merged_list[-1] # 计算时间差,单位为秒,3600秒等于1小时 time_gap = (record.startTime - last_record['endTime']).total_seconds() if time_gap <= 3600: # 符合合并条件,更新结束时间为两者最大值 last_record['endTime'] = max(last_record['endTime'], record.endTime) else: # 不符合条件,新增记录 merged_list.append({ 'Name': record.Name, 'startTime': record.startTime, 'endTime': record.endTime }) return pd.DataFrame(merged_list) # 5. 对每个名称分组应用合并逻辑,得到最终结果 result_df = df.groupby('Name', group_keys=False).apply(merge_continuous_records).reset_index(drop=True) # 6. 查看结果,也可以用result_df.to_excel('合并结果.xlsx', index=False)导出到本地文件 print(result_df)
常见问题说明
- 若运行时出现时间格式转换报错,调整
pd.to_datetime的format参数匹配你的原始时间格式即可 - 若需要调整合并的时间间隔阈值,修改
time_gap <= 3600里的3600为对应秒数即可,比如2小时就改为7200
内容的提问来源于stack exchange,提问作者D.Banerjee
相关产品推荐
相关产品推荐

