基于日期范围合并Pandas DataFrame中同ID的连续日期行
合并Pandas DataFrame中同一ID的连续日期行
这是个非常实用的时间序列数据整理需求,我来给你一步步实现:
步骤1:确保日期列是datetime类型
首先得把startDate和endDate转换成pandas的datetime格式,不然没法进行日期加减的判断:
import pandas as pd # 示例数据 df = pd.DataFrame({ 'ID': [123, 123, 123], 'startDate': ['2020-01-01', '2020-01-26', '2020-02-09'], 'endDate': ['2020-01-25', '2020-02-08', '2020-03-12'], # 可以加其他测试列,模拟真实场景的多列情况 'remark': ['阶段记录', '阶段记录', '阶段记录'] }) # 转换日期列 df['startDate'] = pd.to_datetime(df['startDate']) df['endDate'] = pd.to_datetime(df['endDate'])
步骤2:标记连续日期的分组
按ID分组后,我们需要判断每一行是否和上一行是连续的(即当前行的startDate等于上一行endDate的次日)。用shift()获取上一行的日期,然后生成一个分组标签:
# 按ID分组,判断当前行是否是新分组的起始行 df['is_new_group'] = df.groupby('ID').apply( lambda x: x['startDate'] != x['endDate'].shift() + pd.Timedelta(days=1) ).reset_index(drop=True) # 生成分组ID,连续的行会被分到同一组 df['group_id'] = df.groupby('ID')['is_new_group'].cumsum()
步骤3:聚合合并连续行
最后按ID和group_id分组,对startDate取最小值,endDate取最大值,其他列如果在连续行中值一致,用first()或者last()保留即可:
# 聚合合并 merged_df = df.groupby(['ID', 'group_id']).agg( startDate=('startDate', 'min'), endDate=('endDate', 'max'), # 其他列按实际业务选择聚合方式,这里假设同一组内值相同,取第一个 remark=('remark', 'first') ).reset_index(drop=True) print(merged_df)
运行后你会得到期望的结果:
ID startDate endDate remark 0 123 2020-01-01 2020-03-12 阶段记录
补充说明
- 如果你的其他列在连续行中存在不同值,可以根据业务需求调整聚合方式,比如用
list()把所有值存起来,或者自定义逻辑处理。 - 这个方法支持任意数量的连续行,不管是3行还是更多,都能正确合并成一行。
内容的提问来源于stack exchange,提问作者Awans
相关产品推荐
相关产品推荐

