如何在Pandas DataFrame中合并相同ID的重叠日期区间?
解决方案:合并Pandas DataFrame中相同ID的重叠日期区间
这个需求完全可以实现,以下是具体步骤和代码实现:
步骤说明
- 转换日期格式:将字符串类型的日期列转为Pandas的datetime类型,确保日期比较逻辑有效。
- 分组排序:按ID分组后,对每个组内的日期区间按开始日期排序,保证处理顺序正确。
- 合并重叠区间:遍历每个分组内的区间,判断当前区间是否与已合并的最后一个区间重叠,重叠则合并(保留最早开始日期和最晚结束日期),不重叠则保留为独立区间。
代码实现
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
相关产品推荐
相关产品推荐

