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

Python实现同ID下出院日期与订单日期的30天校验

修正逐行校验30天复查标记的问题

原代码的核心问题是针对整个ID组做一次性判断,而非逐行校验当前行的出院日期与同ID下所有订单日期的关系:

  • 它将组内的Order Date和Discharge Date逐行对应比较(比如第i条订单日期和第i条出院日期对比)
  • 只要存在任意一组逐行对比满足条件,就把该ID下的所有行都标记为Yes,完全偏离了“逐行检查当前行出院日期是否匹配同ID任意订单日期”的需求

方案1:逐行分组校验(直观易读)

先确保日期列是datetime类型,再按ID分组后,对每一行单独校验其出院日期与同ID下所有订单日期的时间差:

import pandas as pd

# 转换日期列为datetime格式(如果尚未转换)
df['Order Date'] = pd.to_datetime(df['Order Date'])
df['Discharge Date'] = pd.to_datetime(df['Discharge Date'])

def process_id_group(group):
    # 对组内每一行,检查当前出院日期与同ID所有订单日期的时间差是否在30天内
    group['30 Day Review'] = group.apply(
        lambda row: 'Yes' if any(
            abs(row['Discharge Date'] - group['Order Date']).dt.days <= 30
        ) else 'No',
        axis=1
    )
    return group

# 按ID分组处理并合并结果
df = df.groupby('ID').apply(process_id_group)

需求适配说明

如果你的需求是订单日期必须在出院日期之后的30天内(而非正负30天均可),可以去掉abs(),修改判断条件:

lambda row: 'Yes' if any(
    group['Order Date'] <= row['Discharge Date'] + pd.DateOffset(days=30)
) else 'No'

方案2:广播计算(性能优化,适合大数据量)

当数据量较大时,用广播批量计算时间差可避免逐行循环的性能损耗:

import pandas as pd

df['Order Date'] = pd.to_datetime(df['Order Date'])
df['Discharge Date'] = pd.to_datetime(df['Discharge Date'])

def process_id_group(group):
    # 广播计算当前组所有出院日期与所有订单日期的时间差
    date_diff = abs(group['Discharge Date'].values[:, None] - group['Order Date'].values)
    # 检查每行是否存在符合条件的订单日期
    has_valid_order = (date_diff <= pd.Timedelta(days=30)).any(axis=1)
    # 转换为Yes/No标记
    group['30 Day Review'] = ['Yes' if flag else 'No' for flag in has_valid_order]
    return group

df = df.groupby('ID').apply(process_id_group)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:30:28