1

我想将一个纪元时间戳(例如,et =1351036517.179364)转换为 datetime.datetime 对象。到目前为止,我已经使用了 time.ctime(et) ,它给了我类似“Fri Oct 5 22:20:33 2012”的字符串。

最终,我需要 datetime 对象来计算两个数据点之间的时间差,另一个数据点也是一个 datetime 对象。

谢谢!

4

3 回答 3

3

值得记住的是,时间戳没有关联的时区信息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

于 2012-11-13T19:09:04.100 回答
1

要将 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。看

于 2015-01-08T10:14:05.657 回答
1

TLDR

fromtimestamp按照文档中的说明使用

返回与 POSIX 时间戳对应的本地日期 [...如果提供了 tz...],则时间戳将转换为 [提供] tz 的时区。

给定一个 UNIX/EPOCH 时间戳

这是由 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() 返回”时

于 2018-03-02T14:06:37.143 回答