Python解析含超微秒的未知ISO格式datetime的方法咨询
解析含纳秒的Datetime字符串问题
问题重现
尝试解析以下Datetime字符串:
t = '2021-08-21 11:23:45.180999936'
使用datetime.strptime解析:
from datetime import datetime datetime.strptime(t, '%Y-%m-%d %H:%M:%S.%f').time()
运行后报错:
ValueError: unconverted data remains: 936 strptime
问题原因
Python标准库中strptime的%f格式符仅支持6位微秒精度,但目标字符串的小数秒部分是9位(前6位为微秒,后3位为纳秒),超出了%f的解析范围,因此抛出未转换数据的错误。
正确解析方式
方法1:截断字符串到微秒精度
手动截取字符串的前29位(保留小数点后6位),再用strptime解析:
t = '2021-08-21 11:23:45.180999936' t_truncated = t[:29] # 保留到小数点后6位 dt = datetime.strptime(t_truncated, '%Y-%m-%d %H:%M:%S.%f') print(dt.time()) # 输出: 11:23:45.180999
方法2:使用dateutil自动解析(需额外安装)
python-dateutil的解析器支持自动识别纳秒级时间字符串:
# 先安装库:pip install python-dateutil from dateutil import parser t = '2021-08-21 11:23:45.180999936' dt = parser.parse(t) print(dt.time()) # 输出: 11:23:45.180999
方法3:Python 3.9+ 使用fromisoformat
Python 3.9及以上版本的datetime.fromisoformat原生支持解析含纳秒的ISO 8601格式字符串:
from datetime import datetime t = '2021-08-21 11:23:45.180999936' dt = datetime.fromisoformat(t) print(dt.time()) # 输出: 11:23:45.180999
对应的ISO格式
该字符串符合ISO 8601扩展格式,ISO 8601允许时间的小数秒部分包含1-9位数字,分别对应从十分之一秒到纳秒的精度。Python标准库的strptime仅实现了6位微秒的解析,因此无法直接处理9位纳秒格式。
内容的提问来源于stack exchange,提问作者Des Grieux
相关产品推荐
相关产品推荐

