Использование% f с strftime () в Python для получения микросекунд

112

Я пытаюсь использовать strftime () с точностью до микросекунд, что кажется возможным с использованием% f (как указано здесь ). Однако, когда я пробую следующий код:

import time
import strftime from time

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

... Я получаю час, минуты и секунды, но% f печатается как% f, без каких-либо признаков микросекунд. Я использую Python 2.6.5 на Ubuntu, так что все должно быть в порядке, и% f должен поддерживаться (насколько я знаю, он поддерживается для версии 2.6 и выше).

user820924
источник

Ответы:

182

Вы можете использовать функцию strftime datetime, чтобы получить это. Проблема в том, что strftime времени принимает временную шкалу, которая не несет информации о микросекундах.

from datetime import datetime
datetime.now().strftime("%H:%M:%S.%f")

Должен сработать!

adamnfish
источник
1
Нет, если вы хотите использовать%z
vallentin
@Vallentin уверен, что все наоборот! datetime поддерживает %zдирективу, пока время не работает .
adamnfish
Оба поддерживают %zPython 3 :-) здесь datetime, а затем time
adamnfish
Ох ты прав. Я пропустил это на datetime, так как он не был внизу, как в таблице для времени. : P
vallentin
6
обратите внимание на from datetime import datetime. Если вы просто сделаете это, import datetimeвам придется использоватьdatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk
34

Вы просматриваете не ту документацию. У timeмодуля есть другая документация .

Вы можете использовать datetimeмодуль strftimeтак:

>>> from datetime import datetime
>>>
>>> now = datetime.now()
>>> now.strftime("%H:%M:%S.%f")
'12:19:40.948000'
Йохен Ритцель
источник
1
Вот ссылка на документацию модуля datetime: docs.python.org/2/library/…
г-н Фуз 01
Спасибо за сообщение. Зачем нужен модуль даты и времени?
tommy.carstensen
9

С timeмодулем Python вы не можете получить микросекунды %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
>>>
baltasvejas
источник
6

Это должно сделать работу

import datetime
datetime.datetime.now().strftime("%H:%M:%S.%f")

Он напечатает

HH:MM:SS.microseconds как это например 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
Превосходно. Спасибо за вашу помощь. Мне удалось заставить все работать, хотя я обнаружил странную ошибку, которая означает, что микросекунды не появляются при запуске скрипта как sudo в определенной cset, но появляются, если я вхожу в систему как sudo, прежде чем пытаться запустить его в определенной cset. Странный.
user820924
4

Если "% f" для микросекунд не работает, используйте следующий метод:

import datetime

def getTimeStamp():
    dt = datetime.datetime.now()
    return dt.strftime("%Y%j%H%M%S") + str(dt.microsecond)
user2189872
источник
3
Это не сработает, если в dt.microsecond меньше 6 цифр.
M456
3
Это было единственное решение, которое действительно сработало для меня. В Jython в Windows% f, кажется, всегда печатает буквальное значение% f. Я хотел миллисекунды, поэтому использовал str (dt.microsecond) [0: 3]
Эд Рэндалл
1
str (dt.microsecond) [0: 3] может дать неверный результат (например, 300 микросекунд - это 0,300 миллисекунды, но будет напечатано 300!)
cabbi
3
"% 03d"% int (dt.microsecond / 1000) -> выводит миллисекунды, а не микросекунды
cabbi
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точность - сколько десятичных знаков вы хотите. Обратите внимание, что у функции нет проблем с начальными нулями в дробной части, как в некоторых других решениях, представленных здесь.

мато
источник
-1

Если вам нужно целое число, попробуйте этот код:

import datetime
print(datetime.datetime.now().strftime("%s%f")[:13])

Вывод:

1545474382803
Рафаль Энден
источник