【问题标题】:Get POSIX/Unix time in seconds and nanoseconds in Python?在 Python 中以秒和纳秒为单位获取 POSIX/Unix 时间?
【发布时间】:2011-01-24 13:38:01
【问题描述】:

我一直试图找到一种方法来获取自 1970 年 1 月 1 日 00:00:00 UTC 以来的时间,在 python 中以秒和纳秒为单位,但我找不到任何可以给我适当精度的东西。

我尝试过使用时间模块,但精度只有微秒,所以我尝试的代码是:

import time

print time.time()

这给了我这样的结果:

1267918039.01

但是,我需要一个看起来像这样的结果:

1267918039.331291406

有人知道以秒和纳秒表示 UNIX 时间的可能方法吗?我找不到设置正确精度或以正确格式获得结果的方法。感谢您的帮助

【问题讨论】:

  • @GregS:坚持是随着年龄而来的 :)

标签: python time posix


【解决方案1】:

由于 Python 3.7,使用time.time_ns() 很容易实现

类似于time(),但以自纪元以​​来的整数纳秒返回时间。

Python 3.7 版本中包含纳秒的所有新功能: PEP 564: Add new time functions with nanosecond resolution

【讨论】:

  • 这是纳秒时间的简洁本机快捷方式!但是,当我尝试执行 time.time_ns() 时,它总是输出 000 以实现纳秒级精度。我可以通过像这样"%.1f" % time.time_ns() 打印来获得更准确的精度。你知道为什么吗? @vishes_shell
  • @addicted time.time_ns() 返回整数,所以没有浮点数。我相信纳秒是你能得到的最准确的。
  • 抱歉,我可能不清楚。我的意思是每次我使用 time_ns 时整数都以 000 结尾。例如,它返回 1577173496123123000 而不是 1577173496123123123。它不应该每次都是 000,即使它是整数。
  • @addicted stackoverflow.com/questions/53868389/… 高度相关。
【解决方案2】:

由于字符串格式,您的精度正在丢失:

>>> import time
>>> print "%.20f" % time.time()
1267919090.35663390159606933594

【讨论】:

  • 其实我可以想象它精确到这么多小数位,但是有精度! :)
  • 你的意思是它不精确到这么多小数位。 time.time() on recent CPython uses the clock_gettime(2), GetSystemTimeAsFileTime() depening on OS (you can call them on earlier Python versions too) -- 尽管系统时间可能不够准确,即使对于旧的基于微秒的接口。
  • 自 1970 年 4 月 15 日以来,无论您使用什么格式,都不可能从 time.time 获得纳秒精度,因为 time.time 返回浮点数,它只有 53 位有效位精度,只能表示大约 104 天的纳秒精度(9007199254740992 纳秒)。
  • 这个答案具有欺骗性,因为正如其他人所提到的,时间精度存在各种限制。您可以要求尽可能多的精度,这并不意味着任何“真实”。 print('{:f}'.format(time.time()*1e99)) 1586191079196933855371082093348346232762798658965005626373153402400776535386890150019453108167635773543153664.000000 @martijn-pieters 有正确的方法,time.get_clock_info(name) 告诉你你实际上能得到多少。默认 printf 为 6 位小数(1 μs),这是大多数 time.time() 实现的精度限制。
【解决方案3】:

问题可能与您的操作系统有关,而不是 Python。参见time模块的文档:http://docs.python.org/library/time.html

time.time()

将时间作为浮点数返回 以秒表示的数字,因为 纪元,以 UTC 为单位。请注意,即使 时间总是作为 浮点数,不是全部 系统提供更好的时间 精度超过 1 秒。虽然这 函数正常返回 非递减值,它可以返回一个 如果值低于前一次调用 系统时钟已调回 两次通话之间。

换句话说:如果你的操作系统做不到,Python 也做不到。您可以将返回值乘以适当的数量级以获得纳秒值,尽管它可能并不精确。

编辑:返回是一个浮点变量,因此逗号后的位数会有所不同,无论您的操作系统是否具有该精度级别。您可以使用"%.nf" 对其进行格式化,其中n 是您想要的位数,但是,如果您想要一个定点字符串表示。

【讨论】:

  • 我认为问题可能既不在于操作系统也不在于python......问题是应该有一种方法来获取元数据,该元数据是当前支持的最高精度的时间以及一种获取时间在那,我们不知道。 :)
【解决方案4】:

这取决于时钟的类型以及您的操作系统和硬件,您是否甚至可以获得纳秒精度根本。来自time module documentation:

各种实时函数的精度可能低于其值或参数表示的单位所建议的精度。例如。在大多数 Unix 系统上,时钟每秒只“滴答”50 或 100 次。

在 Python 3 上,time 模块让您可以访问 5 种不同类型的时钟,每种都有不同的属性;其中一些可能为您提供纳秒级精度计时。使用time.get_clock_info() function 查看每个时钟提供的功能以及报告的精确时间。

在我的 OS X 10.11 笔记本电脑上,可用的功能有:

>>> for name in ('clock', 'monotonic', 'perf_counter', 'process_time', 'time'):
...     print(name, time.get_clock_info(name), sep=': ')
...
clock: namespace(adjustable=False, implementation='clock()', monotonic=True, resolution=1e-06)
monotonic: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
perf_counter: namespace(adjustable=False, implementation='mach_absolute_time()', monotonic=True, resolution=1e-09)
process_time: namespace(adjustable=False, implementation='getrusage(RUSAGE_SELF)', monotonic=True, resolution=1e-06)
time: namespace(adjustable=True, implementation='gettimeofday()', monotonic=False, resolution=1e-06)

所以使用time.monotonic() 或time.perf_counter() 函数理论上会给我纳秒级的分辨率。两个时钟都没有给我墙上的时间,只有经过的时间;否则这些值是任意的。然而,它们对于测量花费了多长时间很有用。

【讨论】:

    【解决方案5】:

    您不太可能真正从任何当前机器获得纳秒级精度。

    机器无法创建精度,并且在不合适的地方显示有效数字不是正确的做法。

    【讨论】:

      【解决方案6】:

      我不认为有一种独立于平台的方式(也许某些第三方已经编写了代码,但我找不到它)以纳秒为单位获取时间;您需要以特定于平台的方式进行操作。例如,this SO question 的回答显示了如何在为“实时”操作提供librt.so 系统库的平台上执行此操作。

      【讨论】:

        猜你喜欢
        • 2021-03-19
        • 1970-01-01
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2012-10-07
        • 1970-01-01
        相关资源
        最近更新 更多