我有一个csv文件,其日期时间为unixtimestamp格式,毫秒和时区信息也以毫秒为单位。我想将其转换为更实用的日期时间格式,以便进一步处理。
例如,时间为1437323953822
,时区为-14400000
。
我可以使用
将时间戳转换为日期时间datetime.datetime.fromtimestamp(1437323953822/1000)
但是我现在如何整合时区,即我所知道的-4 UTC时间。
(-14400000 / 1000 / 60 / 60) = -4
如何使用此时区获取实际时间?
答案 0 :(得分:1)
fromtimestamp
还可以为时区采用另一个参数,即tzinfo
的子类:
classmethod datetime.fromtimestamp(timestamp[, tz])
返回与POSIX时间戳对应的本地日期和时间, 例如
time.time()
返回的。如果可选参数tz
是 无或未指定,时间戳转换为平台 本地日期和时间,返回的datetime对象是天真的。否则
tz
必须是类tzinfo
子类的实例,并且 时间戳转换为tz
的时区。在这种情况下,结果是 相当于tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).
答案 1 :(得分:0)
fromtimestamp()
已经返回您的本地时间,即如果fromtimestamp()
自动正确确定,则您无需附加utc偏移量:
#!/usr/bin/env python
from datetime import datetime
local_time = datetime.fromtimestamp(1437323953822 * 1e-3)
# -> datetime.datetime(2015, 7, 19, 12, 39, 13, 822000)
在某些情况下, fromtimestamp()
可能会失败,例如,如果本地时区过去有不同的utc偏移量,而fromtimestamp()
在给定平台(特别是Windows)上不使用历史时区数据库。在这种情况下,从utc time和给定的utc offset明确构造本地时间:
#!/usr/bin/env python
from datetime import datetime, timedelta
utc_time = datetime(1970, 1, 1) + timedelta(milliseconds=1437323953822)
utc_offset = timedelta(milliseconds=-14400000)
local_time = utc_time + utc_offset
# -> datetime.datetime(2015, 7, 19, 12, 39, 13, 822000)
Python always expects POSIX Epoch因此可以对其进行硬编码。显式公式可能更精确(没有舍入误差)并且它可以接受更宽范围的输入时间戳(fromtimestamp()
范围取决于平台,并且可能比相应的datetime
范围窄。)
答案 2 :(得分:0)
这个问题很老,但是我想给出一个更全面的答案。
fromtimestamp
确实将unix时间戳转换为平台的时间。如果您在不同平台上工作,则正确设置平台的时区很重要。如果您希望使用UTC,则应使用utcfromtimestamp
。
要直接回答OP的问题,以下代码将基于偏移量创建一个时区。
from datetime import datetime, timezone, timedelta
ts = int('1604750712')
tz = timezone(-timedelta(hours=4))
print(datetime.fromtimestamp(ts, tz).strftime('%Y-%m-%d %H:%M:%S'))
timezone
对象是tzinfo
的具体类,我以距UTC 4小时的负偏移量启动了它。