为何Pandas to_datetime对一种格式保留纳秒,另一种格式报错?
带纳秒时间戳转换报错原因解析
问题场景
通过pandas.to_datetime转换带纳秒的时间戳时,标准格式的字符串可以正常解析,但自定义分隔符的格式会报错:
正常运行的代码:
import pandas as pd print(pd.to_datetime('2023-01-02 03:04:05.012345678', format='%Y-%m-%d %H:%M:%S.%f')) # 输出:2023-01-02 03:04:05.012345678
报错代码:
import pandas as pd print(pd.to_datetime('2023.01.02D03:04:05.012345678', format='%Y.%m.%dD%H:%M:%S.%f')) # 报错:ValueError: unconverted data remains: 678
环境:Python v3.9.0、Pandas v1.5.0
报错原因
核心原因是Pandas 1.5.0版本中,%f格式符仅支持解析最多6位的微秒数,而你的时间字符串包含9位纳秒(012345678),两种场景的解析逻辑存在差异:
- 对于标准的"日期+空格+时间"格式,Pandas做了兼容处理,会自动识别并保留超过6位的纳秒部分,不会严格限制
%f的6位解析上限; - 但使用自定义分隔符
D时,Pandas会严格按照你指定的format字符串解析,%f仅匹配前6位小数,剩下的678没有对应格式符可以匹配,因此触发"未转换数据剩余"的报错。
解决办法
- 升级Pandas到1.6.0及以上版本:新版本的
%f支持解析最多9位纳秒数,可直接处理该自定义格式; - 手动截断小数部分:将字符串中的小数部分保留前6位后再进行解析;
- 使用
dateutil.parser.parse:该工具支持自动识别更多时间格式,无需指定format(需先安装python-dateutil库)。
内容的提问来源于stack exchange,提问作者Chuu
相关产品推荐
相关产品推荐

