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

pandas read_csv parse_dates转datetime失败的原因与解决方法

失效原因

pd.read_csv()的parse_dates参数默认采用推断式时间解析逻辑:只要待转换列存在任意1个无法识别为合法时间的字符串,解析器就会直接放弃整列转换,将列保留为原始object(字符串)类型,且不会抛出显性报错。
对比两份结构相似的CSV文件:

  • 可正常解析的solution版本文件中,time列所有值均为统一合法的%Y-%m-%d %H:%M:%S格式,无异常条目,因此可被自动识别转换
  • 解析失效的challenge版本文件中,time列存在非法时间值(例如不存在的日期2017-04-31 03:12:21,公历4月仅有30天),触发了解析失败的回退逻辑,最终整列未被转换为时间类型
修复方法
  • 方案1:读取时指定解析规则,自动处理异常值
    传入自定义解析逻辑,明确时间格式的同时指定错误处理策略,该方式解析性能最高:
    import pandas as pd
    df = pd.read_csv(
        'challenge版traffic.csv文件路径',
        parse_dates=['time'],
        date_parser=lambda x: pd.to_datetime(x, format="%Y-%m-%d %H:%M:%S", errors="coerce")
    )
    
    参数errors="coerce"会将所有无法解析的非法时间值转换为pandas时间类型的空值NaT,不会阻断整列的类型转换。
  • 方案2:读取后单独转换时间列,方便后续清洗异常
    先全量读取文件为原始字符串格式,再单独对time列做类型转换,便于后续定位修正异常条目:
    import pandas as pd
    df = pd.read_csv('challenge版traffic.csv文件路径')
    # 执行时间类型转换
    df['time'] = pd.to_datetime(df['time'], errors='coerce')
    # 可选:筛选出所有时间解析失败的行做手动修正
    invalid_time_records = df[df['time'].isna()]
    

转换完成后执行df.dtypes即可看到time列类型为datetime64[ns],转换生效。


内容的提问来源于stack exchange,提问作者Nuri Taş

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 09:24:16