如何筛选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
相关产品推荐
相关产品推荐

