pandas调用to_datetime转换日期列报ValueError,单独测试却正常
报错原因及解决方案
核心原因
- 你指定了固定的时间格式
%Y-%m-%d %H:%M:%S.%f,但DataFrame的datecreated列中存在部分不符合该格式的字符串,导致整体转换失败。单独测试报错信息里的单条数据正常,不代表整列所有数据都符合格式要求。 - 从报错提示中的
time data "2021-09-16 16:32:11.643333"可以看到,你的时间字符串外层包裹了多余的双引号,你单独测试时大概率没有携带这层引号,因此单条测试可以通过,整列转换失败。 - 其他可能的异常情况包括:部分时间字符串没有微秒部分、存在前后空白字符/不可见特殊字符、少数行是完全不符合时间格式的异常值。
解决步骤
第一步:定位异常数据
先执行以下代码找出所有转换失败的行,确认异常数据的具体格式:
# 临时转换,标记错误位置 temp_series = pd.to_datetime(df['datecreated'], format='%Y-%m-%d %H:%M:%S.%f', errors='coerce') # 输出前20条转换失败的原始数据 print(df[temp_series.isna()]['datecreated'].head(20))
第二步:针对性修复
根据排查到的异常情况选择对应解决方案:
- 如果是字符串携带多余引号/空白字符:先做字符串清理再转换
# 移除字符串外层的双引号、前后空白字符 df['datecreated'] = df['datecreated'].str.strip('" ') # 执行转换 df['datecreated']= pd.to_datetime(df['datecreated'], format='%Y-%m-%d %H:%M:%S.%f')
- 如果是部分数据没有微秒部分,格式不统一:可以让pandas自动推断格式,不需要强制指定固定format
# 开启自动推断格式,转换效率优于完全不指定参数 df['datecreated']= pd.to_datetime(df['datecreated'], infer_datetime_format=True)
- 如果存在多种时间格式混合:分批次转换填充
# 先转换带微秒的格式,错误值转为NaT df['datecreated'] = pd.to_datetime(df['datecreated'], format='%Y-%m-%d %H:%M:%S.%f', errors='coerce') # 再转换不带微秒的格式,填充之前的NaT df['datecreated'] = df['datecreated'].fillna(pd.to_datetime(df['datecreated'], format='%Y-%m-%d %H:%M:%S', errors='coerce')) # 如有其他格式可以继续补充fillna逻辑
内容的提问来源于stack exchange,提问作者Dhruv
相关产品推荐
相关产品推荐

