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

Pandas pd.to_datetime转换有效日期时返回NaT问题排查

问题根源

你遇到的NaT问题由3个常见的Pandas用法错误导致:

  • 第一处错误是replace方法的用法矛盾:当你给replace设置inplace=True时,方法会直接在原列上修改数据,返回值为None。你将这个None重新赋值给df['Date'],会直接把整列覆盖为空值,后续转datetime自然全部返回NaT。
  • 第二处错误是日期格式不匹配:你指定的format="%d/%m/%Y"仅支持4位长度的年份,原始数据中错误的5位年份20201完全不符合格式规则,设置errors="coerce"后所有匹配失败的值都会被强制转为NaT,后续重复调用转换也不会修复这个问题。
  • 第三处错误是对errors="ignore"的逻辑误解:这个参数的实际逻辑是只要整列存在任意一个转换失败的值,就直接返回原始字符串列,不执行任何转换操作,并不是你以为的“跳过错误值、正常转换合法值”。此时列本质还是字符串类型,只是没有抛出报错,让你误以为转换成功。
正确修复步骤
  1. 先修正年份错误,replace操作的两种写法二选一即可,禁止同时使用inplace=True和赋值操作:
    # 写法1:不使用inplace,直接接收返回值,字符串替换更精准
    df['Date'] = df['Date'].str.replace('20201', '2021')
    
    # 写法2:使用inplace原地修改,不做赋值
    # df['Date'].replace('20201', '2021', inplace=True)
    
  2. 执行日期转换,显式指定日/月/年的格式即可避免解析歧义,转换后所有值都会是合法的datetime类型,不会出现NaT:
    df['Date'] = pd.to_datetime(df['Date'], format="%d/%m/%Y")
    
补充说明

如果后续遇到其他无法识别的脏日期,可以加上errors="coerce"参数,将确实无法转换的值设为NaT后再单独排查,不要使用errors="ignore",该参数无法实现“跳过错误值转换剩余内容”的效果。

测试用原始脏数据参考:

DateABC
07/01/20201ab2
08/01/20201bc2
09/01/2022cd1
10/01/2022de1
13/01/2022ef3
14/01/2022fg3
17/01/2022gh3

你提供的字典中17/4/20201这类格式不统一的日期(月份、日期没有补前导零),也可以被上述带format参数的转换逻辑正确识别为2021年4月17日。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 02:24:15