将RFC 3339纳秒时间转换为Python datetime

3

有没有一种简单的方法将RFC 3339纳秒时间转换为常规的Python时间戳?

例如,时间= '2022-07-14T12:01:25.225089838+08:00', 我找到了一种使用datetime的方法

from datetime import datetime

time = '2022-07-14T12:01:25.225089+08:00'
date = datetime.fromisoformat(time)  # good

time = '2022-07-14T12:01:25.225089838+08:00'
date = datetime.fromisoformat(time)  # error

它可以处理像'2022-07-14T12:01:25.225089+08:00'这样的字符串,但它无法处理上述时间。

可能是重复问题 https://dev59.com/C2kv5IYBdhLWcg3waANT - Kota Mori
1
ISO 8601 不支持纳秒,Python 的 datetime 类也不支持。您可以使用字符串切片来删除这三个字符。 - Tim Roberts
@TimRoberts,ISO 8601 的哪个部分禁止了纳秒? - FObersteiner
2个回答

2
有几种方法可以做到这一点。具体取决于输入格式和您如何定义易用性。实际上,有很多帖子问类似的问题。如果您感兴趣,请参考我将在最后发布的一些内容,并在发布前检查。
datetime对象的主要问题是它只保留6位数字。如果要保存所有数字,则需要不同的数据结构。
如果您可以接受截断为6位数字,FObersteiner的答案是完美的。另一种方法是使用原始datetime字符串解析。
from datetime import datetime
date = '2022-07-14T12:01:25.225089838+08:00'.removesuffix('+08:00')
x = datetime.strptime( date[:-3], '%Y-%m-%dT%H:%M:%S.%f')

如果您想保留所有数字,您可以创建一个扩展自datetime类的自定义类或创建一些函数来实现。
以下是需要翻译的内容:
1.

将RFC 3339时间转换为标准Python时间戳

2.

解析包含纳秒的日期时间字符串


小提示:removesuffix() 是 Python 3.9+ 的新功能。 - oelna

1

来自datetime.fromisoformat文档

注意:此方法不支持解析任意的 ISO 8601 字符串,它只是 datetime.isoformat() 的反操作。更全面的 ISO 8601 解析器 dateutil.parser.isoparse 可在第三方包 dateutil 中使用。


dateutil 的 isoparse 方法可以胜任此任务:

from dateutil.parser import isoparse

time = '2022-07-14T12:01:25.225089838+08:00'
date = isoparse(time) 

print(date)
# 2022-07-14 12:01:25.225089+08:00

print(repr(date))
# datetime.datetime(2022, 7, 14, 12, 1, 25, 225089, tzinfo=tzoffset(None, 28800))

注意:它不会四舍五入到微秒,而是直接截取最后3位小数。因此,如果你处理的是像RFC 3339这样的标准化格式,你可以自己进行截取。例如:
from datetime import datetime

time = '2022-07-14T12:01:25.225089838+08:00'
date = datetime.fromisoformat(time[:-9] + time[-6:])

print(date)
# 2022-07-14 12:01:25.225089+08:00

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接