Usando% f con strftime () en Python para obtener microsegundos

112

Estoy tratando de usar strftime () con precisión de microsegundos, lo que parece posible usando% f (como se indica aquí ). Sin embargo, cuando intento el siguiente código:

import time
import strftime from time

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

... Obtengo la hora, los minutos y los segundos, pero% f se imprime como% f, sin signos de microsegundos. Estoy ejecutando Python 2.6.5 en Ubuntu, por lo que debería estar bien y% f debería ser compatible (es compatible con 2.6 y superior, hasta donde yo sé).

user820924
fuente

Respuestas:

181

Puede usar la función strftime de datetime para obtener esto. El problema es que el tiempo strftime de time acepta un timetuple que no lleva información de microsegundos.

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

¡Debería hacer el truco!

maldito pez
fuente
1
No si quieres usar%z
vallentin
¡@Vallentin está bastante seguro de que es lo contrario! datetime apoya la %zdirectiva mientras que el tiempo no parece hacerlo .
adamnfish
Ambos son compatibles %zcon Python 3 :-) aquí está la fecha y la hora y luego la hora
adamnfish
Oh, tienes razón. Lo perdí en la fecha y hora porque no estaba en la parte inferior, como en la mesa para el tiempo. : P
vallentin
6
nota el from datetime import datetime. Si lo hace import datetime, tendrá que usardatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk
34

Estás viendo la documentación incorrecta. El timemódulo tiene documentación diferente .

Puedes usar el datetimemódulo strftimeasí:

>>> from datetime import datetime
>>>
>>> now = datetime.now()
>>> now.strftime("%H:%M:%S.%f")
'12:19:40.948000'
Jochen Ritzel
fuente
1
Aquí está el enlace a la documentación del módulo de fecha y hora: docs.python.org/2/library/…
Mr Fooz
Gracias por la publicacion. ¿Por qué hay un módulo de fecha y hora?
tommy.carstensen
9

Con el timemódulo de Python no se pueden obtener microsegundos %f.

Para aquellos que todavía quieren ir timesolo con el módulo, aquí hay una solución 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))

Debería obtener algo como 2017-01-16 16: 42: 34.625 EET (sí, uso milisegundos, ya que es suficiente).

Para dividir el código en detalles, pegue el siguiente código en una consola de 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 fines de aclaración, también pego mi resultado de Python 2.7.12 aquí:

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

Esto debería hacer el trabajo

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

Se imprimirá

HH:MM:SS.microseconds así por ejemplo 14:38:19.425961

salah Laaroussi
fuente
5

También puede obtener una precisión de microsegundos del timemódulo usando su time()función.
( time.time()devuelve el tiempo en segundos desde epoch. Su parte fraccionaria es el tiempo en microsegundos, que es lo que desea).

>>> 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)
Pushpak Dagade
fuente
1
Excelente. Gracias por toda tu ayuda. Me las arreglé para hacer que las cosas funcionen, aunque encontré un error extraño que significa que los microsegundos no aparecen cuando se ejecuta el script como sudo en un cset en particular, pero lo hago si inicio sesión como sudo antes de intentar ejecutarlo en un cset en particular. Impar.
user820924
4

Cuando el "% f" de microsegundos no funciona, utilice el siguiente método:

import datetime

def getTimeStamp():
    dt = datetime.datetime.now()
    return dt.strftime("%Y%j%H%M%S") + str(dt.microsecond)
usuario2189872
fuente
3
Esto no funcionará si el dt.microsecond tiene menos de 6 dígitos.
M456
3
Esta fue la única solución que realmente funcionó para mí. En Jython en Windows,% f parece imprimir siempre un% f literal. Quería milisegundos, así que usé str (dt.microsecond) [0: 3]
Ed Randall
1
str (dt.microsecond) [0: 3] podría producir un resultado incorrecto (por ejemplo, 300 microsegundos son 0.300 milisegundos, ¡pero imprimirá 300!)
cabbi
3
"% 03d"% int (dt.microsecond / 1000) -> imprime los milsegundos y no los microsegundos
cabbi
0

Si quieres velocidad, prueba esto:

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

Dónde precestá la precisión: cuántos lugares decimales desea. Tenga en cuenta que la función no tiene problemas con ceros a la izquierda en la parte fraccionaria como algunas otras soluciones presentadas aquí.

mato
fuente
-1

Si quieres un número entero, prueba este código:

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

Salida:

1545474382803
Rafal Enden
fuente