在Python中,如何将纪元以来的秒数转换为“datetime”对象?

问题描述 投票:0回答:6

time
模块可以使用自纪元以来的秒数进行初始化:

import time
t1 = time.gmtime(1284286794)
t1
time.struct_time(tm_year=2010, tm_mon=9, tm_mday=12, tm_hour=10, tm_min=19, 
                 tm_sec=54, tm_wday=6, tm_yday=255, tm_isdst=0)

是否有一种优雅的方式以同样的方式初始化

datetime.datetime
对象?

python datetime date time epoch
6个回答
548
投票

datetime.datetime.fromtimestamp
就可以了,如果你知道时区,你可以产生与
time.gmtime

相同的输出
>>> datetime.datetime.fromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 11, 19, 54)

>>> datetime.datetime.utcfromtimestamp(1284286794)
datetime.datetime(2010, 9, 12, 10, 19, 54)

62
投票

自纪元到

datetime
strftime
的秒数:

>>> ts_epoch = 1362301382
>>> ts = datetime.datetime.fromtimestamp(ts_epoch).strftime('%Y-%m-%d %H:%M:%S')
>>> ts
'2013-03-03 01:03:02'

53
投票

从文档中,从纪元以来的秒数获取时区感知日期时间对象的推荐方法是:

Python 3

from datetime import datetime, timezone
datetime.fromtimestamp(timestamp, timezone.utc)

Python 2,使用

pytz

from datetime import datetime
import pytz
datetime.fromtimestamp(timestamp, pytz.utc)

10
投票

请注意,对于 1970 年 1 月 1 日之前的日期,datetime.datetime.fromtimestamp(timestamp) 和 .utcfromtimestamp(timestamp) 在 Windows 上失败,而负 Unix 时间戳似乎在基于 UNIX 的平台上工作。文档是这样说的:

如果时间戳超出范围,可能会引发 ValueError 平台 C gmtime() 函数支持的值。常见于 这仅限于 1970 年至 2038 年

另请参阅问题1646728


7
投票

对于那些希望符合 ISO 8601 标准的人,因为其他解决方案没有

T
分隔符或时间偏移(Meistro 的答案除外):

from datetime import datetime, timezone
result = datetime.fromtimestamp(1463288494, timezone.utc).isoformat('T', 'microseconds')
print(result) # 2016-05-15T05:01:34.000000+00:00

注意,我使用

fromtimestamp
,因为如果我使用
utcfromtimestamp
,我无论如何都需要链接
.astimezone(...)
来获得偏移量。

如果您不想一直走到

microseconds
,您可以选择不同的单位 isoformat()方法。


0
投票

秒(或分钟或小时等)是时间差,即 timedelta,因此另一种方法是将秒转换为

timedelta
对象并将其添加到 UNIX 纪元(即 1970-01-01 00:00: 00 世界标准时间)。

from datetime import datetime, timedelta, UTC
# for UTC datetime
datetime.fromtimestamp(0, UTC) + timedelta(seconds=1284286794)
# ^^^^^ UNIX epoch

# for naive datetime
datetime.fromtimestamp(0) + timedelta(seconds=1284286794)

此方法也适用于纪元之前的时间戳(即负秒),与直接将负数传递给

fromtimestamp
不同,这会引发 OSError(至少在 Windows 上)。

datetime.fromtimestamp(0, UTC) + timedelta(seconds=-1284286794)

在某种程度上相关的说明中,如果您已经在使用 numpy,那么您也可以使用

np.datetime64
将整数转换为日期时间。这些整数被解释为相对于 UNIX 纪元的偏移量。您只需使用
[s]
(几秒钟)通过单位。 numpy 的好处是,您可以将整个秒列表以向量方式转换为日期时间数组。

np.array([1284286794, 0, -1284286794], dtype='datetime64[s]')
© www.soinside.com 2019 - 2024. All rights reserved.