如何查找Python DataFrame中格式错误的日期值并完成修复
日期列异常值排查与转换方案
直接用astype硬转object类型的日期列,只要碰到1条非法格式值就会直接抛错中断,针对3400行规模的数据集,用pandas自带的容错转换参数就能快速定位所有异常值,不需要逐行检查。
1. 定位Birthday列的非法日期
替换你原来的硬转代码,先用pd.to_datetime的容错模式把解析失败的值标记为空,再直接筛出异常记录:
import pandas as pd # 解析时碰到非法值不报错,统一标记为NaT(时间类型的空值) # 注意:如果你的日期格式是日/月/年,把dayfirst参数改成True Cdf['temp_birthday'] = pd.to_datetime(Cdf['Birthday'], errors='coerce', dayfirst=False) # 筛选所有解析失败的行,查看异常原始值 invalid_records = Cdf[Cdf['temp_birthday'].isna()] print(f"共定位到{len(invalid_records)}条非法日期,异常值分布:") print(invalid_records['Birthday'].value_counts())
你报错里提到的25/15就是典型的非法值:月份取值范围是1-12,出现15要么是录入时月份填错,要么是日期和月份的顺序搞反了,筛出来之后可以根据实际业务规则修正。
2. 转换得到不带时间的日期值
确认所有异常值修正完毕后,直接提取日期部分即可,不需要保留时间精度:
# 转成纯日期类型,不带时分秒 Cdf['Birthday'] = Cdf['temp_birthday'].dt.date # 删除临时辅助列 Cdf.drop(columns=['temp_birthday'], inplace=True)
3. 批量处理全部日期列
你总共有14列需要做日期转换,可以写循环一次性排查所有列的异常,不用逐列调试:
# 替换成你数据集中所有需要转日期的列名 date_col_list = ['Birthday', 'VisitDate', 'DischargeDate'] for col in date_col_list: Cdf[f'temp_{col}'] = pd.to_datetime(Cdf[col], errors='coerce', dayfirst=False) invalid_num = Cdf[f'temp_{col}'].isna().sum() if invalid_num > 0: print(f"=== 列[{col}]存在{invalid_num}条非法日期 ===") print(Cdf[Cdf[f'temp_{col}'].isna()][col].value_counts())
所有列的异常都修正完之后,统一替换原列、删除临时列就行。后续计算患者年龄直接用解析后的日期列和当前日期做差值即可,不会再出类型错误。
内容的提问来源于stack exchange,提问作者onqun
相关产品推荐
相关产品推荐

