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ş
相关产品推荐
相关产品推荐

