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

如何在Pandas DataFrame中合并相同ID的重叠日期区间?

解决方案:合并Pandas DataFrame中相同ID的重叠日期区间

这个需求完全可以实现,以下是具体步骤和代码实现:

步骤说明

  1. 转换日期格式:将字符串类型的日期列转为Pandas的datetime类型,确保日期比较逻辑有效。
  2. 分组排序:按ID分组后,对每个组内的日期区间按开始日期排序,保证处理顺序正确。
  3. 合并重叠区间:遍历每个分组内的区间,判断当前区间是否与已合并的最后一个区间重叠,重叠则合并(保留最早开始日期和最晚结束日期),不重叠则保留为独立区间。

代码实现

1. 构造示例数据(或导入你的原始数据)

import pandas as pd

data = {
    "ID": [5194, 5193, 5193, 5193, 5191, 5191, 5188],
    "START DATE": ["2019-05-15", "2017-02-08", "2017-02-15", "2021-04-01", "2020-10-01", "2019-02-28", "2018-10-01"],
    "END DATE": ["2019-05-31", "2017-04-02", "2017-04-10", "2021-05-15", "2020-11-20", "2019-04-20", "2018-11-30"]
}

df = pd.DataFrame(data)

2. 转换日期列类型

df["START DATE"] = pd.to_datetime(df["START DATE"])
df["END DATE"] = pd.to_datetime(df["END DATE"])

3. 定义合并重叠区间的函数

def merge_overlapping_intervals(group):
    # 按开始日期排序,保证处理顺序正确
    sorted_group = group.sort_values("START DATE")
    merged = []
    for _, row in sorted_group.iterrows():
        if not merged:
            merged.append(row.to_dict())
        else:
            last_interval = merged[-1]
            # 检查当前区间是否与上一个合并后的区间重叠
            if row["START DATE"] <= last_interval["END DATE"]:
                # 合并:更新结束日期为两者的最大值
                last_interval["END DATE"] = max(last_interval["END DATE"], row["END DATE"])
            else:
                merged.append(row.to_dict())
    return pd.DataFrame(merged)

4. 分组应用合并函数

merged_df = df.groupby("ID", group_keys=False).apply(merge_overlapping_intervals)

5. 查看结果

print(merged_df)

执行后输出结果如下:

ID START DATE   END DATE
0   5188 2018-10-01 2018-11-30
0   5191 2019-02-28 2019-04-20
1   5191 2020-10-01 2020-11-20
0   5193 2017-02-08 2017-04-10
1   5193 2021-04-01 2021-05-15
0   5194 2019-05-15 2019-05-31

关于日期中点方法的问题

日期中点方法仅能判断两个区间是否重叠,但无法处理多个连续重叠的区间场景;且如果未对区间按开始日期排序,处理顺序混乱也会导致合并失败。上面的方法通过排序+逐次合并,能覆盖所有重叠场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 22:15:52