在 Python 中,如何将自纪元以来的秒数转换为“datetime”对象?
- 2025-03-11 08:50:00
- admin 原创
- 70
问题描述:
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
是否有一种优雅的方法以相同的方式初始化对象?
解决方案 1:
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)
解决方案 2:
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'
解决方案 3:
从文档中,从纪元以来的秒数获取时区感知日期时间对象的推荐方法是:
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)
解决方案 4:
请注意,datetime.datetime.fromtimestamp (timestamp) 和 .utcfromtimestamp ( timestamp) 在 Windows 上无法处理 1970 年 1 月 1 日之前的日期,而负数 unix 时间戳似乎在基于 unix 的平台上有效。文档中这样写道:
“如果时间戳超出平台 C gmtime() 函数支持的值范围,则可能引发 ValueError。通常将其限制为 1970 年至 2038 年之间的年份”
另请参阅问题 1646728
解决方案 5:
对于那些希望它符合 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(...)
以获得偏移量。
如果您不想一路走下去,您可以使用isoformat()microseconds
方法选择不同的单位
。
解决方案 6:
秒(或分钟或小时等)是时间差,即 timedelta,因此另一种方法是将秒转换为timedelta
对象并将其添加到 UNIX 纪元(即 1970-01-01 00:00:00 UTC)。
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]')
扫码咨询,免费领取项目管理大礼包!