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

如何检查新增日期范围是否落在特定实体已有日期区间内

检查DataFrame中特定实体的新增日期区间是否被已有区间覆盖

示例数据表

EntityValueSdateEDateType
A51/1/20234/1/2023event1
A66/1/20238/1/2023event2
B81/1/20233/1/2023event1
B95/1/20236/1/2023event2

场景说明

如果为实体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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:42:22