如何将超出范围的纪元转换为日期时间 python?

How to convert out of range epoch to datetime python?

我们有一个功能,我们希望将纪元转换为日期时间对象并将它们格式化为 python 中的字符串。此外,我们还想将超出范围的纪元转换为日期时间并将它们格式化回字符串。但是,python 日期时间对象不支持大日期,例如 429790838400 格式为 13/07/15589 日期。

[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> dt = datetime.fromtimestamp(429790838400)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year 15589 is out of range

有人可以指导我们如何实现这一目标吗?

来自 datetime docs

datetime.MAXYEAR The largest year number allowed in a date or datetime object. MAXYEAR is 9999.

允许的最大时间戳可以是

date -d '9999-12-31 23:59:59' '+%s'
253402311599

在 python

上使用该值
Python 2.7.18 (default, Mar 04 2021, 23:25:57) [GCC] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> datetime.fromtimestamp(253402311599)
datetime.datetime(9999, 12, 31, 23, 59, 59)

加 1 秒

>>> datetime.fromtimestamp(253402311600)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: year is out of range

python3 上的解决方法 (?) 以获得差异

>>> datetime.datetime.utcfromtimestamp(429790838400 - datetime.datetime(datetime.MAXYEAR,12,31,23,59,59).timestamp())
datetime.datetime(7559, 7, 13, 21, 0, 1)

内置 python 日期时间受自纪元 1970 以来的秒数限制)您可以存储为整数。作为 ,对你的问题的简短回答是“你不能”。

cftime 库是为气候科学、天文学和其他时间范围不够的应用而开发的。它有一个 datetime-compatible 界面,但支持更广泛的日历和日期范围。

查看 cftime.num2date。我认为只要您的整数在标准公历中定义为自 1970 年以来的秒数,它就应该开箱即用。

此外,如果您要与 pandas 或其他 pydata 库一起使用 CFTime,值得一试 xr.cftime_range,它将创建一个范围索引以用于重采样操作等.