在Python中使用strftime()和%f获取微秒

153

我想使用strftime()函数以微秒精度输出时间,这似乎可以通过使用 %f 实现(正如 这里 所述)。然而,当我尝试运行以下代码时:

import time
import strftime from time

print strftime("%H:%M:%S.%f")

我可以得到小时,分钟和秒数,但%f的输出只有%f,没有微秒的迹象。我在Ubuntu上运行Python 2.6.5,所以应该没问题,%f也应该被支持(据我所知,它适用于2.6及以上版本)。

8个回答

228
你可以使用 datetime 的 strftime 函数来实现。问题是 time 的 strftime 函数接受的是一个 timetuple,而该类型并不包含微秒信息。
from datetime import datetime
datetime.now().strftime("%H:%M:%S.%f")

应该可以解决问题!


2
不要使用 %z。 - vallentin
@Vallentin 相信相反的情况是正确的!datetime 支持 %z 指令,而 time 似乎不支持 - adamnfish
两者在Python 3中都支持%z :-) 这是datetimetime - adamnfish
1
哦,你说得对。我错过了datetime,因为它不像时间表格那样在底部。 :P - vallentin
7
请注意 from datetime import datetime。如果只使用 import datetime,则需要使用 datetime.datetime.now().strftime("%H:%M:%S.%f") - JBaczuk

40

您正在查看错误的文档。 time 模块的 文档不同

您可以使用 datetime 模块,像这样使用 strftime

>>> from datetime import datetime
>>>
>>> now = datetime.now()
>>> now.strftime("%H:%M:%S.%f")
'12:19:40.948000'

1
这是datetime模块文档的链接:http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior - Mr Fooz
感谢您的帖子。为什么会有日期时间和时间模块? - tommy.carstensen
https://dev59.com/BWs05IYBdhLWcg3wDttn - brennanyoung

16

使用Python的time模块无法通过%f获取微秒。

对于仍想仅使用time模块的人,这里有个解决方法:

now = time.time()
mlsec = repr(now).split('.')[1][:3]
print time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec), time.localtime(now))

你应该会得到类似于2017-01-16 16:42:34.625 EET 的结果(是的, 我使用毫秒,因为它足够精确)。

若要详细了解代码,请将以下代码复制并粘贴到Python控制台中:

import time

# Get current timestamp
now = time.time()

# Debug now
now
print now
type(now)

# Debug strf time
struct_now = time.localtime(now)
print struct_now
type(struct_now)

# Print nicely formatted date
print time.strftime("%Y-%m-%d %H:%M:%S %Z", struct_now)

# Get miliseconds
mlsec = repr(now).split('.')[1][:3]
print mlsec

# Get your required timestamp string
timestamp = time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec), struct_now)
print timestamp

为了澄清,我在这里也贴出了我的Python 2.7.12的结果:

>>> import time
>>> # get current timestamp
... now = time.time()
>>> # debug now
... now
1484578293.519106
>>> print now
1484578293.52
>>> type(now)
<type 'float'>
>>> # debug strf time
... struct_now = time.localtime(now)
>>> print struct_now
time.struct_time(tm_year=2017, tm_mon=1, tm_mday=16, tm_hour=16, tm_min=51, tm_sec=33, tm_wday=0, tm_yday=16, tm_isdst=0)
>>> type(struct_now)
<type 'time.struct_time'>
>>> # print nicely formatted date
... print time.strftime("%Y-%m-%d %H:%M:%S %Z", struct_now)
2017-01-16 16:51:33 EET
>>> # get miliseconds
... mlsec = repr(now).split('.')[1][:3]
>>> print mlsec
519
>>> # get your required timestamp string
... timestamp = time.strftime("%Y-%m-%d %H:%M:%S.{} %Z".format(mlsec), struct_now)
>>> print timestamp
2017-01-16 16:51:33.519 EET
>>>

7
这应该能完成工作。
import datetime
datetime.datetime.now().strftime("%H:%M:%S.%f")

它将会打印出如下格式的时间:HH:MM:SS.毫秒数,例如:14:38:19.425961

5

使用 time 模块的 time() 函数,您还可以获得微秒精度。
(time.time() 返回自纪元以来的秒数。它的小数部分是微秒时间,这就是您想要的。)

>>> from time import time
>>> time()
... 1310554308.287459   # the fractional part is what you want.


# comparision with strftime -
>>> from datetime import datetime
>>> from time import time
>>> datetime.now().strftime("%f"), time()
... ('287389', 1310554310.287459)

1
太好了,感谢您的所有帮助。我已经成功让它工作了,尽管发现一个奇怪的错误,即当在特定的cset上以sudo身份运行脚本时,微秒不会出现,但如果我在尝试在特定的cset上运行之前以sudo身份登录,则会出现。很奇怪。 - oakbramble

5

当微秒的"%f"无法使用时,请使用以下方法:

import datetime

def getTimeStamp():
    dt = datetime.datetime.now()
    return dt.strftime("%Y%j%H%M%S") + str(dt.microsecond)

3
如果 dt.microsecond 小于 6 位数,这将无法起作用。 - M456
3
这是我唯一实际有效的解决方案。在Windows上使用Jython时,“%f”似乎总是打印出一个字面的“%f”。我需要毫秒,所以使用了“str(dt.microsecond)[0:3]”。 - Ed Randall
1
str(dt.microsecond)[0:3] 可能会产生错误的结果(例如,300 微秒是 0.300 毫秒,但它会打印出 300!) - cabbi
3
"%03d"%int(dt.microsecond/1000) -> 这将打印毫秒而不是微秒。 - cabbi

0
如果你想要一个整数,可以尝试这段代码:
import datetime
print(datetime.datetime.now().strftime("%s%f")[:13])

输出:

1545474382803

0
如果你想要速度,试试这个:
def _timestamp(prec=0):
    t = time.time()
    s = time.strftime("%H:%M:%S", time.localtime(t))
    if prec > 0:
        s += ("%.9f" % (t % 1,))[1:2+prec]
    return s

prec 是精度 -- 您想要多少小数位。

请注意,此函数不会像其他在此处提供的解决方案一样,在小数部分中存在前导零的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接