如何裁剪含9位微秒的时间字符串以转换为datetime对象
问题说明
现有表示时间的字符串,秒后的小数部分为9位(纳秒级),但Python标准库datetime的%f格式化符默认仅支持解析6位微秒值,直接传入原始字符串会触发格式不匹配报错。示例待处理字符串:
'2022-05-09 08:02:18.106869456 +0000 UTC'
需要裁剪小数秒部分多余的3位数字,完成datetime对象的正确转换。
实现方案
1. 通用兼容方案(全Python版本支持,鲁棒性最高,优先推荐)
用正则精准匹配秒后的小数段,仅保留前6位,不需要硬编码字符串切片索引,不会因为日期、时区部分的长度变化出现匹配错误。
import re from datetime import datetime raw_time_str = '2022-05-09 08:02:18.106869456 +0000 UTC' # 匹配小数点后的数字串,保留前6位,裁掉多余部分 fixed_time_str = re.sub(r'(\.\d{6})\d+', r'\1', raw_time_str) # 按固定格式解析即可 dt_instance = datetime.strptime(fixed_time_str, '%Y-%m-%d %H:%M:%S.%f %z %Z')
避坑提示:不要使用固定位置切片的方式裁剪字符串,比如写死切出前26位再拼接后续内容,一旦时间串里的月、日为个位数(比如
2022-5-9而非补零的2022-05-09),索引位置会直接偏移,导致裁剪结果错误,这类问题隐蔽性很强,线上排查成本极高。
2. 高版本Python简洁方案(Python 3.11+可用)
Python 3.11对strptime的%f解析逻辑做了升级,支持最多9位的小数秒输入,不需要做任何字符串预处理,直接解析原始字符串即可:
from datetime import datetime raw_time_str = '2022-05-09 08:02:18.106869456 +0000 UTC' dt_instance = datetime.strptime(raw_time_str, '%Y-%m-%d %H:%M:%S.%f %z %Z')
如果你的运行环境能确定是Python 3.11及以上版本,选这个方案代码最简洁,没有额外处理逻辑。
内容的提问来源于stack exchange,提问作者Simcha Storch
相关产品推荐
相关产品推荐

