Pandas Groupby场景下计算重叠日期区间的起止时间
实现目标
基于你已完成的重叠簇标记结果,为每个同组重叠簇计算实际重叠区间的起止日期,新增字段直接展示在原DataFrame中。
注意:重叠区间指簇内所有日期范围的公共交集,不是簇内最早开始、最晚结束时间组成的总覆盖时间范围
实现步骤
- 首先修正原代码的小问题:原
df.drop('Range', axis=1)没有接收返回值,实际不会修改原DataFrame。 - 重叠区间计算规则:
- 同一重叠簇内的公共交集起点为簇内所有记录
Start_Date的最大值 - 公共交集终点为簇内所有记录
End_Date的最小值 - 非重叠簇、或计算后起点晚于终点(说明原簇标记存在误判、实际无交集)的记录,重叠起止字段设为空时间值
NaT
- 同一重叠簇内的公共交集起点为簇内所有记录
完整代码
接你原有代码之后运行即可:
# 移除中间生成的Range列 df = df.drop('Range', axis=1) def calc_overlap(group): # 非重叠簇直接返回空值 if not group['Cluster'].iloc[0]: group['Overlap_Start'] = pd.NaT group['Overlap_End'] = pd.NaT return group # 计算交集起止 overlap_start = group['Start_Date'].max() overlap_end = group['End_Date'].min() # 校验交集合法性 if overlap_start > overlap_end: group['Overlap_Start'] = pd.NaT group['Overlap_End'] = pd.NaT else: group['Overlap_Start'] = overlap_start group['Overlap_End'] = overlap_end return group # 按G2+Cluster分组计算,同一G2下的标记才属于同一个潜在重叠组 df = df.groupby(['G2', 'Cluster'], group_keys=False).apply(calc_overlap)
结果验证
以G2=A1分组的两条重叠记录为例:
- 记录1:2020-06-01 ~ 2022-05-31
- 记录2:2020-12-01 ~ 2021-11-30
- 计算得到重叠区间:
Overlap_Start=2020-12-01,Overlap_End=2021-11-30,和实际日期交集完全一致。
内容的提问来源于stack exchange,提问作者user1855463
相关产品推荐
相关产品推荐

