如何按values_1分组提取存在时间重叠的DataFrame行?
技术实现方案:分组提取时间重叠的DataFrame行
核心思路
按values_1字段分组后,对每组内的时间区间(Start DateTime和End DateTime)进行重叠检测,仅保留至少与组内某一行存在时间重叠的记录,同时兼容非连续日期场景。
步骤实现
1. 确保日期列格式正确
先将日期列转换为datetime类型(若原始数据未转换):
import pandas as pd # 转换日期列格式 df['Start DateTime'] = pd.to_datetime(df['Start DateTime']) df['End DateTime'] = pd.to_datetime(df['End DateTime'])
2. 定义分组处理函数
编写函数实现单组内的重叠检测与筛选:
def filter_overlapping(group): # 按起始时间排序,便于重叠判断 sorted_group = group.sort_values('Start DateTime').reset_index(drop=True) row_count = len(sorted_group) # 初始化重叠标记数组 has_overlap = [False] * row_count # 检查当前行与前一行的重叠 for i in range(1, row_count): prev_end = sorted_group.iloc[i-1]['End DateTime'] curr_start = sorted_group.iloc[i]['Start DateTime'] if curr_start < prev_end: has_overlap[i] = True has_overlap[i-1] = True # 检查当前行与后一行的重叠(覆盖跨多行的间接重叠场景) for i in range(row_count - 1): curr_end = sorted_group.iloc[i]['End DateTime'] next_start = sorted_group.iloc[i+1]['Start DateTime'] if curr_end > next_start: has_overlap[i] = True has_overlap[i+1] = True # 返回存在重叠的行 return sorted_group[has_overlap]
3. 分组应用筛选函数
对values_1分组后应用上述函数,得到最终结果:
result_df = df.groupby('values_1', group_keys=False).apply(filter_overlapping)
关键说明
- 重叠判断逻辑:默认采用「当前区间起始时间早于另一区间结束时间」作为重叠标准,若业务需要包含端点(如
Start DateTime等于另一行的End DateTime也算重叠),可将条件中的<改为<=、>改为>=。 - 非连续日期兼容:通过先排序再逐行检测的方式,无论日期是否连续,只要组内存在重叠区间就会被识别并保留。
- 目标效果匹配:自动剔除组内无任何重叠的行(如VGM组的uniqId=2567、WEH组的uniqId=9854),保留所有行均重叠的组(如POH、PNM组)。
内容的提问来源于stack exchange,提问作者Tarak Pandya
相关产品推荐
相关产品推荐

