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

如何筛选DataFrame中不符合DD/MM/YYYY格式的值并拆分数据集

实现方案

你之前的代码存在两个问题:

  • 传入的format参数错误:%Y%m%d用于匹配20220507这类无分隔符的年月日格式,和你数据使用的DD/MM/YYYY格式完全不匹配,会导致合法日期也被误判为空值
  • 直接将转换结果覆盖原始列,会丢失原始的错误值内容,无法留存异常记录

正确实现逻辑是先基于原始数据做日期合法性校验,通过布尔标记拆分数据集,全程不修改原始字段值,完整保留异常内容:

单日期列校验(以Date raised列为例)

import pandas as pd

# 按DD/MM/YYYY格式解析日期,非法值(格式错误、不存在的日期如31/02/2021)会被转为NaT
# 注意不要修改原始df的列
parsed_date = pd.to_datetime(df['Date raised'], format='%d/%m/%Y', errors='coerce')

# 拆分数据集
# 异常数据集:解析为空的行,保留全部原始字段
invalid_df = df[parsed_date.isna()].reset_index(drop=True)
# 合法数据集:解析正常的行
valid_df = df[parsed_date.notna()].reset_index(drop=True)

# 可选:将合法数据的日期列替换为datetime类型,方便后续时间计算
valid_df['Date raised'] = parsed_date[parsed_date.notna()]

多日期列同时校验

如果需要同时校验Date raised、Date Resolved两列,只要判断任意一列解析失败即归为异常数据即可:

# 分别解析两列日期
parsed_raised = pd.to_datetime(df['Date raised'], format='%d/%m/%Y', errors='coerce')
parsed_resolved = pd.to_datetime(df['Date Resolved'], format='%d/%m/%Y', errors='coerce')

# 生成异常数据标记:任意一列解析失败即为异常
invalid_mask = parsed_raised.isna() | parsed_resolved.isna()

# 拆分数据集
invalid_df = df[invalid_mask].reset_index(drop=True)
valid_df = df[~invalid_mask].reset_index(drop=True)

效果验证

基于你提供的示例数据运行上述代码,得到的invalid_df会完全匹配你需要的异常结果:

Incident Ref              User Priority level Date raised Date Resolved
0         48109         Nick Fury     Priority 3         abc    20/05/2022
1         58391  Natasha Romanoff     Priority 2  31/02/2021    01/03/2022

剩余3条合法数据会存入valid_df。

注意:如果业务明确要求日期必须严格遵循DD/MM/YYYY格式,一定要保留format='%d/%m/%Y'参数,否则pandas会自动推断日期格式,可能出现月、日字段误判的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 21:24:22