You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将RFC 3339纳秒级时间转换为Python datetime对象

问题原因

Python 3.11 以下版本的标准库datetime.fromisoformat()仅支持解析最多6位小数的微秒级RFC3339/ISO格式时间,且原生datetime对象本身的最高时间精度为微秒,无法直接存储纳秒级时间分量,因此直接传入9位小数的纳秒时间字符串会触发解析错误。

可用方案

方案1:无第三方库、快速截断兼容(日常场景推荐)

如果不需要严格保留纳秒级精度(绝大多数业务场景下微秒精度足够),可以先通过简单的字符串预处理,将秒的小数部分截断到6位,再调用原生方法解析,代码量极小:

from datetime import datetime
import re

time_str = '2022-07-14T12:01:25.225089838+08:00'
# 正则匹配秒后的小数段,仅保留前6位微秒部分
processed_str = re.sub(r"(\.\d{6})\d+", r"\1", time_str)
dt = datetime.fromisoformat(processed_str)
# 转标准Unix时间戳
timestamp = dt.timestamp()

如果不想引入正则,处理固定格式的时间字符串时也可以直接通过字符串切片实现相同截断效果。

方案2:无第三方库、保留完整纳秒精度

如果需要完整保留纳秒精度输出时间戳,可以手动拆分纳秒部分单独计算,避免精度损失:

from datetime import datetime

time_str = '2022-07-14T12:01:25.225089838+08:00'
if '.' in time_str:
    # 拆分主体时间、小数秒、时区三部分
    main_part, remain = time_str.split('.', 1)
    tz_sign = '+' if '+' in remain else '-'
    frac_part, tz_part = remain.split(tz_sign)
    # 处理纳秒部分,不足9位右侧补0,超过9位截断
    nanosecond = int(frac_part.ljust(9, '0')[:9])
    # 解析无小数的时间主体,加上纳秒对应的秒偏移
    dt = datetime.fromisoformat(f"{main_part}{tz_sign}{tz_part}")
    timestamp = dt.timestamp() + nanosecond / 1e9
else:
    dt = datetime.fromisoformat(time_str)
    timestamp = dt.timestamp()

方案3:第三方库一行解析(适合已有相关依赖的场景)

如果你的环境已经安装了pandas,可以直接用其原生支持纳秒精度的时间解析能力,不需要做任何字符串预处理:

import pandas as pd

time_str = '2022-07-14T12:01:25.225089838+08:00'
ts = pd.Timestamp(time_str)
timestamp = ts.timestamp()

如果不想装体量较大的pandas,也可以使用python-dateutil库的isoparse方法解析,不过注意该方法解析后生成的原生datetime对象仍会截断纳秒到微秒级。

补充说明

Python 3.11及以上版本已经优化了datetime.fromisoformat()的解析逻辑,传入9位小数的纳秒时间字符串不会再抛出错误,但会自动将纳秒部分四舍五入到微秒精度存储,不需要额外做字符串截断处理。

内容的提问来源于stack exchange,提问作者Peter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 14:45:32