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

基于日期范围合并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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 11:17:28