在Python中以秒和纳秒获取POSIX/Unix时间?

Bil*_*ill 42 python time posix

我一直在努力找到一种方法来获取自1970-01-01 00:00:00 UTC以来的时间,以秒为单位,在python中以纳秒为单位,我找不到能给我正确精度的任何东西.

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

import time

print time.time()
Run Code Online (Sandbox Code Playgroud)

这给了我这样的结果:

1267918039.01
Run Code Online (Sandbox Code Playgroud)

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

1267918039.331291406
Run Code Online (Sandbox Code Playgroud)

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

Mat*_*ttH 40

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

>>> import time
>>> print "%.20f" % time.time()
1267919090.35663390159606933594
Run Code Online (Sandbox Code Playgroud)

  • 实际上我可以想象这么多的小数位是准确的,但有精度!:) (5认同)
  • 自1970-11-15以来,从时间开始就不可能获得纳秒级的精度.时间无关你使用什么格式,因为time.time返回浮点数,它只有53位有效精度,只能代表大约104天的纳秒精度(9007199254740992)纳秒). (3认同)
  • 你的意思是,对于这么多的小数位,它不是*精确的.最近CPython上的[`time.time()`在操作系统上使用`clock_gettime(2)`,`GetSystemTimeAsFileTime()`(你也可以在早期的Python版本上调用它们)(http://stackoverflow.com/a/ 28574340/4279)) - 尽管可能系统时间不够准确,即使对于基于微秒的旧接口也是如此. (2认同)
  • 这个答案是具有欺骗性的,因为正如其他人提到的那样,时间精度存在各种限制。您可以要求尽可能多的精度,这并不意味着任何“真实”的东西。`print('{:f}'.format(time.time()*1e99)) 158619107919693385537108209334834623276279865896500562637315340240077653538689015001945310816763577 3543153664.000000` @martijn-pieters 有正确的方法,`time.get_clock_info(name)` 告诉你实际可以获得多少。默认的 printf 是 6 位小数(1 μs),这是大多数 time.time() 实现的精度限制。 (2认同)

vis*_*ell 15

Python 3.7开始,它很容易实现time.time_ns()

time()自纪元以来相似但返回时间为整数纳秒.

在Python 3.7版本中包含纳秒的所有新功能: PEP 564:添加具有纳秒分辨率的新时间函数

  • 这是以纳秒为单位的简洁的本地时间快捷方式!然而,当我尝试执行“time.time_ns()”时,它总是输出 000 纳秒精度。我可以通过像这样打印 `"%.1f" % time.time_ns()` 来获得更准确的精度。你知道为什么吗?@vishes_shell (2认同)

Ala*_*lum 9

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

time.time()

将时间作为以UTC为单位以秒为单位表示的浮点数返回.请注意,即使时间总是作为浮点数返回,但并非所有系统都提供的精度高于1秒.虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值.

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

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

  • 我认为问题可能既不是操作系统也不是python ...问题是应该有一种方法来获取元数据,这是目前支持的最大精度时间和一种获取时间的方法,我们这样做不知道.:) (2认同)

Mar*_*ers 6

这取决于时钟和你的操作系统和硬件阉的类型或没有,你甚至可以得到纳秒的精度可言。从time模块文档中

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

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

在我的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)
Run Code Online (Sandbox Code Playgroud)

因此,使用time.monotonic()or time.perf_counter()函数在理论上将为我提供纳秒级的分辨率。两个时钟都没有给我时间,只有经过的时间。否则,这些值是任意的。但是,它们对于测量花费多长时间很有用。


jan*_*anm 5

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

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