pd.to_datetime()遇合法时间值仍抛ValueError的原因排查
问题原因及解决办法
为什么会报错?
当你设置infer_datetime_format=True时,pandas会基于列表中第一个非空元素的格式生成统一解析规则,再用这个规则解析所有后续元素。
如果从Oracle取出的时间列表里,第一个有效时间戳是带毫秒的格式(比如2023-03-31 20:25:10.926000),pandas就会推断格式为%Y-%m-%d %H:%M:%S.%f。后续遇到不带毫秒的时间戳(比如2023-04-24 17:33:23)时,会因缺少毫秒部分触发格式不匹配错误。
而本地硬编码测试时,可能列表第一个元素是不带毫秒的格式,pandas推断的规则是%Y-%m-%d %H:%M:%S,此时带毫秒的元素能被兼容解析(pandas自动忽略多余毫秒部分),所以不会报错。
解决办法
方法1:使用format='mixed'(推荐,Pandas 2.0+支持)
让pandas为每个元素单独推断格式,适配混合格式场景:
df = pd.to_datetime(col_data, format='mixed', errors='coerce')
方法2:统一时间字符串格式
先给不带毫秒的时间字符串补全.000000,再用固定格式解析:
# 处理每个时间字符串,补全毫秒部分 processed_data = [s if '.' in s else f"{s}.000000" for s in col_data] df = pd.to_datetime(processed_data, format="%Y-%m-%d %H:%M:%S.%f", errors='coerce')
方法3:检查隐藏字符(可选)
如果上述方法无效,可能Oracle返回的字符串带有不可见字符(如空格、制表符),可先清理:
processed_data = [s.strip() for s in col_data] df = pd.to_datetime(processed_data, infer_datetime_format=True, errors='coerce')
内容的提问来源于stack exchange,提问作者Yash
相关产品推荐
相关产品推荐

