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

如何查找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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 05:42:31