Usando% f com strftime () em Python para obter microssegundos


112

Estou tentando usar strftime () com precisão de microssegundos, o que parece possível usando% f (conforme declarado aqui ). No entanto, quando tento o seguinte código:

import time
import strftime from time

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

... Recebo a hora, os minutos e os segundos, mas% f imprime como% f, sem sinal de microssegundos. Estou executando o Python 2.6.5 no Ubuntu, então deve funcionar e% f deve ser compatível (é compatível com 2.6 e superior, pelo que eu sei).

Respostas:


181

Você pode usar a função strftime de datetime para fazer isso. O problema é que o strftime do tempo aceita um intervalo de tempo que não carrega informações de microssegundos.

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

Deve fazer o truque!


1
Não se você quiser usar%z
vallentin

@Vallentin com certeza é o oposto! datetime suporta a %zdiretiva enquanto o tempo não parece .
adamnfish de

Ambos são compatíveis %zcom Python 3 :-) aqui está datetime e depois time
adamnfish

Ohh você está certo. Eu perdi no datetime porque não estava no fundo, como na mesa para o tempo. : P
vallentin

6
observe o from datetime import datetime. Se você apenas fizer import datetimeisso, você terá que usardatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk

34

Você está vendo a documentação errada. O timemódulo possui documentação diferente .

Você pode usar o datetimemódulo strftimeassim:

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

1
Aqui está o link para a documentação do módulo datetime: docs.python.org/2/library/…
Sr. Fooz

Obrigado pela postagem. Por que existe um módulo de data e hora?
tommy.carstensen


9

Com o timemódulo do Python você não pode obter microssegundos %f.

Para aqueles que ainda desejam usar timeapenas o módulo, aqui está uma solução 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))

Você deve obter algo como 2017-01-16 16: 42: 34.625 EET (sim, eu uso milissegundos, pois é o suficiente).

Para dividir o código em detalhes, cole o código abaixo em um 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

Para fins de esclarecimento, também colo meu resultado do Python 2.7.12 aqui:

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

Isso deve fazer o trabalho

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

Vai imprimir

HH:MM:SS.microseconds assim por exemplo 14:38:19.425961


5

Você também pode obter precisão de microssegundos do timemódulo usando sua time()função.
( time.time()retorna o tempo em segundos desde a época. Sua parte fracionária é o tempo em microssegundos, que é o que você deseja.)

>>> 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
Excelente. Obrigado por toda sua ajuda. Consegui fazer as coisas funcionarem, embora encontrei um bug estranho que significa que microssegundos não aparecem ao executar o script como sudo em um cset específico, mas aparecem se eu logar como sudo antes de tentar executá-lo em um cset específico. Ímpar.
user820924

4

Quando o "% f" para microssegundos não estiver funcionando, use o seguinte método:

import datetime

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

3
Isso não funcionará se o dt.microsecond tiver menos de 6 dígitos.
M456 de

3
Esta foi a única solução que realmente funcionou para mim. Em Jython no Windows,% f parece sempre imprimir um% f literal. Eu queria milissegundos, então usei str (dt.microsecond) [0: 3]
Ed Randall

1
str (dt.microsecond) [0: 3] pode produzir um resultado incorreto (por exemplo, 300 microssegundos são 0,300 milésimos de segundo, mas vai imprimir 300!)
cabbi

3
"% 03d"% int (dt.microsecond / 1000) -> imprime milésimos de segundo e não microssegundos
cabbi

0

Se você quiser velocidade, tente isto:

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

Onde precestá a precisão - quantas casas decimais você deseja. Observe que a função não tem problemas com zeros à esquerda na parte fracionária como algumas outras soluções apresentadas aqui.


-1

Se você quiser um número inteiro, tente este código:

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

Resultado:

1545474382803
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.