Użycie% f z strftime () w Pythonie, aby uzyskać mikrosekundy


112

Próbuję użyć strftime () z dokładnością do mikrosekund, co wydaje się możliwe przy użyciu% f (jak podano tutaj ). Jednak gdy spróbuję poniższego kodu:

import time
import strftime from time

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

... Otrzymuję godzinę, minuty i sekundy, ale% f wypisuje się jako% f, bez znaku mikrosekund. Używam Pythona 2.6.5 na Ubuntu, więc powinno działać dobrze, a% f powinien być obsługiwany (jest obsługiwany w wersji 2.6 i nowszych, o ile wiem).

Odpowiedzi:


181

Aby to uzyskać, możesz użyć funkcji strftime datetime. Problem polega na tym, że czas strftime czasu akceptuje harmonogram, który nie przenosi informacji mikrosekundowych.

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

Powinien załatwić sprawę!


1
Nie, jeśli chcesz użyć%z
vallentin

@Vallentin na pewno jest odwrotnie! datetime obsługuje %zdyrektywę, podczas gdy czas nie wydaje się .
adamnfish

Oba wsparcie %zw Pythonie 3 :-) tutaj jest
data

Och, masz rację. Brakowało mi tego w datetime, ponieważ nie było na dole, jak na stole przez czas. : P
vallentin

6
zwróć uwagę na from datetime import datetime. Jeśli po prostu to import datetimezrobisz, będziesz musiał skorzystaćdatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk

34

Patrzysz na niewłaściwą dokumentację. timeModuł ma inną dokumentację .

Możesz użyć datetimemodułu w strftimenastępujący sposób:

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

1
Oto link do dokumentacji modułu datetime: docs.python.org/2/library/…
Mr Fooz

Dzięki za post. Dlaczego istnieje moduł daty i godziny?
tommy.carstensen


9

Z timemodułem Pythona nie możesz uzyskać mikrosekund z %f.

Dla tych, którzy nadal chcą korzystać timetylko z modułu, oto obejście:

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

Powinieneś dostać coś takiego jak 2017-01-16 16: 42: 34.625 EET (tak, używam milisekund, bo to wystarczy).

Aby podzielić kod na szczegóły, wklej poniższy kod do konsoli Pythona:

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

W celu wyjaśnienia wklejam tutaj również wynik z Pythona 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

To powinno wystarczyć

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

To się wydrukuje

HH:MM:SS.microseconds jak to np 14:38:19.425961


5

Możesz również uzyskać precyzję w mikrosekundach z timemodułu za pomocą jego time()funkcji.
( time.time()zwraca czas w sekundach od epoki. Jego część ułamkowa to czas w mikrosekundach, czyli taki, jaki chcesz).

>>> 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
Doskonały. Dzięki za całą twoją pomoc. Udało mi się sprawić, że wszystko działało, chociaż znalazłem dziwny błąd, który oznacza, że ​​mikrosekundy nie pojawiają się podczas uruchamiania skryptu jako sudo na określonym cset, ale robię to, jeśli zaloguję się jako sudo przed próbą uruchomienia go na określonym cset. Dziwny.
user820924

4

Jeśli „% f” dla mikro sekund nie działa, użyj następującej metody:

import datetime

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

3
To nie zadziała, jeśli dt.microsecond ma mniej niż 6 cyfr.
M456

3
To było jedyne rozwiązanie, które faktycznie zadziałało dla mnie. W Jythonie w Windows% f wydaje się zawsze wypisywać dosłowne% f. Chciałem milisekund, więc użyłem str (dt.microsecond) [0: 3]
Ed Randall

1
str (dt.microsecond) [0: 3] może dać zły wynik (np. 300 mikrosekund to 0,300 milesekund, ale wypisze 300!)
cabbi

3
"% 03d"% int (dt.microsecond / 1000) -> to wypisuje milisekundy, a nie mikrosekundy
cabbi

0

Jeśli chcesz szybkości, spróbuj tego:

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

Gdzie precjest precyzja - ile miejsc dziesiętnych chcesz. Należy pamiętać, że funkcja nie ma problemów z zerami wiodącymi w części ułamkowej, jak w przypadku niektórych innych przedstawionych tutaj rozwiązań.


-1

Jeśli chcesz liczbę całkowitą, wypróbuj ten kod:

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

Wynik:

1545474382803
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.