我想将一个纪元时间戳(例如,et =1351036517.179364)转换为 datetime.datetime 对象。到目前为止,我已经使用了 time.ctime(et) ,它给了我类似“Fri Oct 5 22:20:33 2012”的字符串。
最终,我需要 datetime 对象来计算两个数据点之间的时间差,另一个数据点也是一个 datetime 对象。
谢谢!
值得记住的是,时间戳没有关联的时区信息。 Unix 时间是明确的 UTC,但将本地时间存储在Unix 样式的时间戳中并不罕见。您必须对照已知的参考资料进行检查以确定。
如果您的时间戳已经是 UTC(Unix 时间),您可以使用 Marc B 的建议直接减去两个 unix 时间戳,以得出它们之间的差异秒数。然后您可能想要创建一个timedelta,这将允许您轻松地datetime
使用它来操作 s (例如,您可以将 timedelta 与日期时间相加或减去)。
datetime.timedelta( seconds= n_seconds )
如果您的时间戳是本地时间,请不要直接减去它们,因为您可能会得到不正确的结果。
相反,您应该首先使用datetime.fromtimestamp,将时区附加到每个 datetime,然后再减去它们以获得 timedelta。
要从 a 转换回timedelta
秒数,可以使用timedelta.total_seconds,假设您使用的是 python 2.7 。如果您有较早的版本,则必须手动进行计算,或者pip install datetime
要将 POSIX 时间戳转换为datetime.datetime
表示 UTC 时间的对象:
from datetime import datetime, timedelta, timezone
timestamp = 1351036517.179364
utc_time = datetime(1970, 1, 1, tzinfo=timezone.utc) + timedelta(seconds=timestamp)
# -> 2012-10-23 23:55:17.179363+00:00
如果您的 Python 版本不支持datetime.timezone
;您可以省略它,以在 UTC 中获取天真的日期时间对象。
我需要 datetime 对象来计算两个数据点之间的时间差,另一个数据点也是 datetime 对象。
如果天真datetime
的对象表示具有不同 UTC 偏移量的本地时间,则您无法直接比较它们,否则您可能会得到错误的结果。您要么需要可识别时区的日期时间对象,要么应首先将日期时间对象转换为 UTC。看
fromtimestamp
按照文档中的说明使用
返回与 POSIX 时间戳对应的本地日期 [...如果提供了 tz...],则时间戳将转换为 [提供] tz 的时区。
这是由 python 生成的时间戳的示例(感谢@jfs 和Paul Ganssle更新)
from datetime import datetime, timezone
epoch = datetime.now(tz=timezone.utc).timestamp() # example: 1520020585.536527
注意:并非所有纪元都是相似的,使用time.time()
将给出自平台相关纪元以来经过的秒数,其中 asdate.timestamp()
为您提供其声称的 POSIX 时间戳,请参阅下面的警告
注意:我特别避免调用.timestamp()
' 输出“符合 POSIX 的”时间戳。如果您的应用程序依赖于该级别的准确性,那么您可能希望使用除.timestamp()
注意:使用datetime.now
它可能会提供更高的精度
注意:我们可以省略tz
上面的参数,但是使用时区感知日期是一个好习惯,因为 python 3 在使用天真日期时可能会做出错误的假设(或者不会在我们认为会抛出错误的地方抛出错误)
给定时间戳(例如1520020585.536527
),我们可以使用如下方式将其转换为 datetime tz 感知对象fromtimestamp
:
from datetime import datetime, timezone
ts = 1520020585.536527 # remember me? I'm the epoch example output from above
utc_date = datetime.fromtimestamp(ts, tz=timezone.utc) # outputs: datetime date object
注意:fromtimestamp
需要一个“POSIX”时间戳,tz
我们在这里提供只是为了避免天真的日期时间对象。fromtimestamp
将为我们提供的时区执行任何需要的转换,但是哪个时区比 UTC 更好,对吧?
注意:虽然python文献明确将输入引用fromtimestamp()
为“POSIX”时间戳,但并未明确将输入称为“POSIX兼容”,因此我们只能从其文献的其他部分推断“POSIX”时间戳是什么,比如当它把 POSIX 输出称为“由 time.time() 返回”时