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

基于日期重叠筛选DataFrame:请求与服务匹配代码问题排查

问题排查与解决建议

核心问题分析

  • 日期列未转为datetime类型:当前代码中日期以字符串格式存储,直接进行大小比较会遵循字符串字典序而非时间顺序,导致重叠判断逻辑完全失效。例如字符串01/04/2023(4月1日)与10/03/2023(3月10日)比较时,会被判定为前者更小,但实际时间是3月10日更早,直接干扰了服务活跃时段的判断。
  • 无对应服务的客户逻辑受日期类型影响:像Client101这类无对应服务记录的客户,理论上应直接归入new_requests,但日期类型错误可能导致判断逻辑异常。

修正步骤

1. 统一转换日期列为datetime类型

先将两个DataFrame的日期列转为标准datetime格式,指定%d/%m/%Y格式避免自动解析错误:

# 转换Requests的日期列
requests['Event Start Date'] = pd.to_datetime(requests['Event Start Date'], format='%d/%m/%Y')
requests['Event End Date'] = pd.to_datetime(requests['Event End Date'], format='%d/%m/%Y')

# 转换LTS的日期列
lts['Event Start Date'] = pd.to_datetime(lts['Event Start Date'], format='%d/%m/%Y')
lts['Event End Date'] = pd.to_datetime(lts['Event End Date'], format='%d/%m/%Y')

2. 优化循环拼接逻辑(提升效率)

原代码反复使用pd.concat拼接DataFrame效率极低,改用列表收集符合条件的行,最后统一转为DataFrame:

new_requests_list = []

for index, request_row in requests.iterrows():
    relevant_lts_rows = lts[lts['Client ID'] == request_row['Client ID']]
    
    # 日期类型修正后,原重叠判断逻辑可正常生效
    overlapping_events = relevant_lts_rows[
        (relevant_lts_rows['Event Start Date'] <= request_row['Event End Date']) & 
        ((relevant_lts_rows['Event End Date'] > request_row['Event Start Date']) | pd.isnull(relevant_lts_rows['Event End Date']))
    ]
    
    if overlapping_events.empty:
        new_requests_list.append(request_row)

new_requests = pd.DataFrame(new_requests_list).reset_index(drop=True)

3. 生成「Currently Open」DataFrame

通过反选new_requests的方式快速得到目标数据集:

# 先标记所有请求是否有活跃服务
requests['has_active_service'] = requests.apply(
    lambda row: not lts[
        (lts['Client ID'] == row['Client ID']) &
        (lts['Event Start Date'] <= row['Event End Date']) &
        ((lts['Event End Date'] > row['Event Start Date']) | pd.isnull(lts['Event End Date']))
    ].empty, axis=1
)

# 拆分两个结果DataFrame
currently_open = requests[requests['has_active_service']].reset_index(drop=True)
new_requests = requests[~requests['has_active_service']].reset_index(drop=True)

验证结果

修正后运行代码,将完全匹配期望输出:

  • new_requests包含Client100的请求100、Client101的请求102
  • currently_open包含Client100的请求101、Client102的请求103

内容的提问来源于stack exchange,提问作者Chizo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:36:13