Utilisation de% f avec strftime () en Python pour obtenir des microsecondes


112

J'essaie d'utiliser strftime () avec une précision de microseconde, ce qui semble possible en utilisant% f (comme indiqué ici ). Cependant, lorsque j'essaye le code suivant:

import time
import strftime from time

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

... J'obtiens l'heure, les minutes et les secondes, mais% f s'imprime sous la forme% f, sans signe des microsecondes. J'exécute Python 2.6.5 sur Ubuntu, donc ça devrait aller et% f devrait être pris en charge (il est pris en charge pour 2.6 et plus, pour autant que je sache.)

Réponses:


181

Vous pouvez utiliser la fonction strftime de datetime pour obtenir cela. Le problème est que le strftime du temps accepte un multiplicateur de temps qui ne porte pas d'informations en microseconde.

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

Devrait faire l'affaire!


1
Pas si vous voulez utiliser%z
vallentin

@Vallentin à peu près sûr que c'est le contraire! datetime prend en charge la %zdirective alors que le temps ne semble pas le faire .
adamnfish

Les deux prennent %zen charge Python 3 :-) voici la date et l' heure
adamnfish

Ohh tu as raison. Je l'ai manqué sur datetime car ce n'était pas en bas, comme sur la table pour le temps. : P
vallentin

6
notez le from datetime import datetime. Si vous le faites, import datetimevous devrez utiliserdatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk

34

Vous consultez la mauvaise documentation. Le timemodule a une documentation différente .

Vous pouvez utiliser le datetimemodule strftimecomme ceci:

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

1
Voici le lien vers la documentation du module datetime: docs.python.org/2/library
Mr Fooz

Merci pour le post. Pourquoi existe-t-il un module datetime et time?
tommy.carstensen


9

Avec le timemodule de Python, vous ne pouvez pas obtenir de microsecondes avec %f.

Pour ceux qui souhaitent toujours utiliser le timemodule uniquement, voici une solution de contournement:

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

Vous devriez obtenir quelque chose comme 2017-01-16 16: 42: 34.625 EET (oui, j'utilise des millisecondes car c'est assez).

Pour diviser le code en détails, collez le code ci-dessous dans une 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

À des fins de clarification, je colle également mon résultat Python 2.7.12 ici:

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

Cela devrait faire le travail

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

Il imprimera

HH:MM:SS.microseconds comme ça par exemple 14:38:19.425961


5

Vous pouvez également obtenir une précision de la microseconde du timemodule en utilisant sa time()fonction.
( time.time()renvoie le temps en secondes depuis l'époque. Sa partie fractionnaire est le temps en microsecondes, ce que vous voulez.)

>>> 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
Excellent. Merci pour votre aide. J'ai réussi à faire fonctionner les choses, bien que j'ai trouvé un bogue étrange qui signifie que les microsecondes n'apparaissent pas lors de l'exécution du script en tant que sudo sur un cset particulier, mais si je me connecte en tant que sudo avant d'essayer de l'exécuter sur un cset particulier. Impair.
user820924

4

Lorsque le "% f" pour les micro secondes ne fonctionne pas, veuillez utiliser la méthode suivante:

import datetime

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

3
Cela ne fonctionnera pas si le dt.microseconde a moins de 6 chiffres.
M456

3
C'était la seule solution qui fonctionnait pour moi. En Jython sur Windows,% f semble toujours afficher un littéral% f. Je voulais des millisecondes donc utilisé str (dt.microseconde) [0: 3]
Ed Randall

1
str (dt.microseconde) [0: 3] pourrait produire un résultat erroné (par exemple, 300 microsecondes valent 0,300 millièmes de seconde, mais il en affichera 300!)
cabbi

3
"% 03d"% int (dt.microseconde / 1000) -> ceci imprime les millsecondes et non les microsecondes
cabbi

0

Si vous voulez de la vitesse, essayez ceci:

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

precest la précision - combien de décimales vous voulez. Veuillez noter que la fonction n'a pas de problèmes avec les zéros non significatifs en partie fractionnaire comme certaines autres solutions présentées ici.


-1

Si vous voulez un entier, essayez ce code:

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

Production:

1545474382803
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.