如何检查新增日期范围是否落在特定实体已有日期区间内
检查DataFrame中特定实体的新增日期区间是否被已有区间覆盖
示例数据表
| Entity | Value | Sdate | EDate | Type |
|---|---|---|---|---|
| A | 5 | 1/1/2023 | 4/1/2023 | event1 |
| A | 6 | 6/1/2023 | 8/1/2023 | event2 |
| B | 8 | 1/1/2023 | 3/1/2023 | event1 |
| B | 9 | 5/1/2023 | 6/1/2023 | event2 |
场景说明
如果为实体A新增一条记录 A, 55, 2/1/2023, 2/20/2023(2023年2月1日至2月20日),由于该区间完全落在A已有的1/1/2023-4/1/2023区间内,这条新记录不应存入数据库。
解决步骤
1. 预处理日期列
首先要把DataFrame中的日期列转换成datetime类型,否则无法正确进行日期比较:
import pandas as pd # 构造示例DataFrame data = { 'Entity': ['A', 'A', 'B', 'B'], 'Value': [5, 6, 8, 9], 'Sdate': ['1/1/2023', '6/1/2023', '1/1/2023', '5/1/2023'], 'EDate': ['4/1/2023', '8/1/2023', '3/1/2023', '6/1/2023'], 'Type': ['event1', 'event2', 'event1', 'event2'] } df = pd.DataFrame(data) # 转换日期格式 df['Sdate'] = pd.to_datetime(df['Sdate'], format='%m/%d/%Y') df['EDate'] = pd.to_datetime(df['EDate'], format='%m/%d/%Y')
2. 编写检查函数
定义一个函数,传入目标实体、新增的起始/结束日期,判断该区间是否被该实体的已有区间完全覆盖:
def is_interval_covered(entity, new_sdate, new_edate, df): # 筛选当前实体的所有记录 entity_data = df[df['Entity'] == entity] if entity_data.empty: return False # 无历史记录,不存在覆盖情况 # 转换新增日期为datetime类型 new_s = pd.to_datetime(new_sdate, format='%m/%d/%Y') new_e = pd.to_datetime(new_edate, format='%m/%d/%Y') # 判断是否存在已有区间完全包含新增区间 return ((entity_data['Sdate'] <= new_s) & (entity_data['EDate'] >= new_e)).any()
3. 测试验证
用示例中的新增记录测试:
# 测试实体A的新增区间 result = is_interval_covered('A', '2/1/2023', '2/20/2023', df) print(result) # 输出True,说明区间被覆盖,不应存入数据库
扩展:判断区间重叠
如果你的需求是新增区间与已有区间存在任何重叠就拒绝存入,可以修改判断条件:
def has_overlap(entity, new_sdate, new_edate, df): entity_data = df[df['Entity'] == entity] if entity_data.empty: return False new_s = pd.to_datetime(new_sdate, format='%m/%d/%Y') new_e = pd.to_datetime(new_edate, format='%m/%d/%Y') # 判断区间是否存在重叠 return ((entity_data['Sdate'] <= new_e) & (entity_data['EDate'] >= new_s)).any()
内容的提问来源于stack exchange,提问作者CodeMaster
相关产品推荐
相关产品推荐

