Utilizzo di% f con strftime () in Python per ottenere microsecondi


112

Sto cercando di usare strftime () con una precisione al microsecondo, che sembra possibile usando% f (come indicato qui ). Tuttavia, quando provo il seguente codice:

import time
import strftime from time

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

... ottengo l'ora, i minuti ei secondi, ma% f stampa come% f, senza alcun segno dei microsecondi. Sto eseguendo Python 2.6.5 su Ubuntu, quindi dovrebbe andare bene e% f dovrebbe essere supportato (è supportato per 2.6 e versioni successive, per quanto ne so.)

Risposte:


181

Puoi usare la funzione strftime di datetime per ottenerlo. Il problema è che lo strftime del tempo accetta un time-triple che non trasporta informazioni in microsecondi.

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

Dovrebbe fare il trucco!


1
No, se vuoi usare%z
vallentin

@Vallentin abbastanza sicuro che sia il contrario! datetime supporta la %zdirettiva mentre il tempo non sembra .
adamnfish

Entrambi supportano %zin Python 3 :-) ecco datetime e poi time
adamnfish

Ohh hai ragione. Mi mancava la data e l'ora poiché non era in fondo, come sul tavolo per il tempo. : P
vallentin

6
notare il from datetime import datetime. Se lo fai, import datetimedovrai usaredatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk

34

Stai guardando la documentazione sbagliata. Il timemodulo ha una documentazione diversa .

Puoi usare il datetimemodulo in strftimequesto modo:

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

1
Ecco il collegamento alla documentazione del modulo datetime: docs.python.org/2/library/…
Mr Fooz

Grazie per il post. Perché esiste un modulo datetime e time?
tommy.carstensen


9

Con il timemodulo di Python non puoi ottenere microsecondi con %f.

Per coloro che vogliono ancora utilizzare timesolo il modulo, ecco una soluzione alternativa:

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

Dovresti ottenere qualcosa come 16-01-2017 16: 42: 34.625 EET (sì, uso i millisecondi perché è abbastanza).

Per suddividere il codice in dettagli, incolla il codice seguente in una console 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

A scopo di chiarimento, incollo anche il mio risultato Python 2.7.12 qui:

>>> 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

Questo dovrebbe fare il lavoro

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

Verrà stampato

HH:MM:SS.microseconds come questo ad es 14:38:19.425961


5

È inoltre possibile ottenere una precisione in microsecondi dal timemodulo utilizzando la sua time()funzione.
( time.time()restituisce il tempo in secondi dall'epoca. La sua parte frazionaria è il tempo in microsecondi, che è quello che vuoi.)

>>> 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
Eccellente. Grazie per tutto il vostro aiuto. Sono riuscito a far funzionare le cose, anche se ho trovato uno strano bug che significa che i microsecondi non vengono visualizzati durante l'esecuzione dello script come sudo su un particolare cset, ma lo faccio se accedo come sudo prima di provare a eseguirlo su un particolare cset. Dispari.
user820924

4

Quando "% f" per micro secondi non funziona, utilizza il seguente metodo:

import datetime

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

3
Questo non funzionerà se il dt.microsecond ha meno di 6 cifre.
M456

3
Questa è stata l'unica soluzione che ha effettivamente funzionato per me. In Jython su Windows% f sembra stampare sempre un% f letterale. Volevo millisecondi quindi ho usato str (dt.microsecond) [0: 3]
Ed Randall,

1
str (dt.microsecond) [0: 3] potrebbe produrre un risultato errato (ad esempio 300 microsecondi sono 0,300 millesecondi, ma ne stamperà 300!)
cabbi

3
"% 03d"% int (dt.microsecond / 1000) -> questo stampa i millsecondi e non i microsecondi
cabbi

0

Se vuoi velocità, prova questo:

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

Dov'è la precprecisione: quante cifre decimali vuoi. Si noti che la funzione non ha problemi con gli zeri iniziali nella parte frazionaria come alcune altre soluzioni presentate qui.


-1

Se vuoi un numero intero, prova questo codice:

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

Produzione:

1545474382803
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.