Використання% f з strroll () в Python для отримання мікросекунд


112

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

import time
import strftime from time

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

... Я отримую годину, хвилини та секунди, але% f друкується як% f, без ознак мікросекунд. Я запускаю Python 2.6.5 на Ubuntu, тому він повинен бути нормальним і підтримувати% f (наскільки я знаю, він підтримується для версії 2.6 і вище).

Відповіді:


181

Ви можете скористатися функцією стрімкінгу datetime, щоб отримати це. Проблема полягає в тому, що строковий час приймає тимчасовий параметр, який не несе мікросекундної інформації.

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

Слід зробити трюк!


1
Якщо ви не хочете скористатися%z
Вален

@Vallentin впевнений, що все навпаки! datetime підтримує %zдирективу, поки час не з'являється .
adamnfish

Обидві підтримують %zу Python 3 :-) ось дата та час
adamnfish

Ой ти маєш рацію. Я сумував за датою, оскільки вона не була внизу, як на столі. : P
валентін

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/…
Містер Фооз

Дякую за пост. Чому існує модуль дати та часу?
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
>>>

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, перш ніж намагатися запустити його на певному наборі. Незвичайно.
user820924

4

Якщо значення "% 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
Це було єдине рішення, яке насправді працювало на мене. У Jython у Windows% f, здається, завжди друкує буквальний% f. Мені хотілося мілісекунд, так що використовується str (dt.microsecond) [0: 3]
Ед Рандалл

1
str (dt.microsecond) [0: 3] може призвести до неправильного результату (наприклад, 300 мікросекунд - це 0,300 мілісекунд, але він надрукує 300!)
таксі

3
"% 03d"% int (dt.microsecond / 1000) -> це друкує мілісекунди, а не мікросекунди
таксі

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.