跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在含缺失值的多列日期中按组筛选最大有效日期

本文介绍如何在 pandas 中对含 nan 的多个日期列(如 `cop_date`、`fat_date`)进行条件过滤与分组聚合,确保每组内各日期列值均不小于基准列 `date`,并统一填充为该组内满足条件的最小有效日期。 在实际数据分析中,常需校验业务逻辑约束:例如某订单的确认日期(cop_date)和失效日期(fat_date)必须晚于主日期(date)。当原始数据存在缺失值(NaN)或违反约束的异常值时,直接取最大值会出错。此时需结合条件筛选、分组聚合与缺失值处理,实现稳健的日期对齐。 ✅ 正确处理流程 统一转为 datetime 类型 首先将所有日期列转换为 datetime64[ns],便于后续比较与计算:
dates = ['date', 'cop_date', 'fat_date'] df[dates] = df[dates].apply(lambda x: pd.to_datetime(x, format='%d/%m/%Y'))
⚠️ 注意:若日期格式不统一(如混用 YYYY-MM-DD 和 DD/MM/YYYY),建议使用 format=None 让 pd.to_datetime() 自动推断,或先清洗再转换。 构建逻辑掩码,标记合规值 判断 cop_date < date 或 fat_date < date 的行——这些是 不合规的异常值 ,应置为 NaT(Pandas 中日期类型的缺失值):
m1 = df['cop_date'] < df['date'] # True 表示 cop_date 过早,需剔除 m2 = df['fat_date'] < df['date'] # 同理
按业务键分组,填充合规最小日期 使用 .where() 保留合规值(m1/m2 为 False 的位置),再通过 groupby(...).transform('min') 实现: 每组内仅保留满足 cop_date >= date 的日期; 若该组无合规值,则结果为 NaT(即保持缺失); 最终将该组最小合规日期广播至所有行。
cols = ['id', 'ins_id'] # 分组依据(如订单ID + 保险子项) df[['cop_date', 'fat_date']] = ( df.assign( cop_date=df['cop_date'].where(~m1), # ~m1 → 保留 cop_date >= date 的值 fat_date=df['fat_date'].where(~m2) ) .groupby(cols)[['cop_date', 'fat_date']] .transform('min') )
? 关键点:~m1 是逻辑取反,表示“cop_date 不小于 date”,即合规;.where(~m1) 将不合规位置设为 NaT,再由 transform('min') 在组内求最小非空日期。 用Apache Spark进行大数据处理 本文档主要讲述的是用Apache Spark进行大数据处理——第一部分:入门介绍;Apache Spark是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。 在这个Apache Spark文章系列的第一部分中,我们将了解到什么是Spark,它与典型的MapReduce解决方案的比较以及它如何为大数据处理提供了一套完整的工具。希望本文档会给有需要的朋友带来帮助;感 下载 可选:还原为原始字符串格式 如需输出为 DD/MM/YYYY 字符串:
df[dates] = df[dates].apply(lambda x: x.dt.strftime('%d/%m/%Y'))
? 总结与建议 本方法避免了 max() 直接作用于含 NaN 的 Series 导致的错误传播,也规避了 fillna() 的盲目补全; transform('min') 确保组内一致性,适用于报表生成、规则校验等场景; 若需取 最大合规日期 而非最小,仅需将 'min' 替换为 'max'; 对超 大数据 集,可考虑用 pd.NaT 替代 np.nan 显式声明日期缺失,提升性能与类型安全。 最终结果中,每组 cop_date 和 fat_date 均被修正为该组内满足 >= date 约束的最小有效日期(若无可合规值则保持 NaN),逻辑清晰且可复现。

相关文章