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

user820924
la source

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!

adamnfish
la source
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'
Jochen Ritzel
la source
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
>>>
baltasvejas
la source
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

salah Laaroussi
la source
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)
Pushpak Dagade
la source
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)
user2189872
la source
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.

mato
la source
-1

Si vous voulez un entier, essayez ce code:

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

Production:

1545474382803
Rafal Enden
la source