Verwenden von% f mit strftime () in Python, um Mikrosekunden abzurufen

112

Ich versuche, strftime () mit einer Mikrosekundengenauigkeit zu verwenden, was mit% f (wie hier angegeben ) möglich erscheint. Wenn ich jedoch den folgenden Code versuche:

import time
import strftime from time

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

... Ich erhalte die Stunde, die Minuten und die Sekunden, aber% f wird als% f gedruckt, ohne Anzeichen von Mikrosekunden. Ich verwende Python 2.6.5 unter Ubuntu, daher sollte es in Ordnung sein und% f sollte unterstützt werden (soweit ich weiß, wird es für 2.6 und höher unterstützt.)

user820924
quelle

Antworten:

182

Sie können die strftime-Funktion von datetime verwenden, um dies zu erhalten. Das Problem ist, dass die Zeit der Zeit ein Zeitfenster akzeptiert, das keine Mikrosekundeninformationen enthält.

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

Sollte den Trick machen!

Adamnfish
quelle
1
Nicht, wenn Sie verwenden möchten%z
Vallentin
@ Vallentin ziemlich sicher, dass es das Gegenteil ist! datetime unterstützt die %zDirektive, solange die Zeit nicht erscheint .
Adamnfish
Beide unterstützen %zin Python 3 :-) Hier ist Datum und Uhrzeit
Adamnfish
Ohh du hast recht Ich habe es zu Datetime verpasst, da es nicht ganz unten war, wie auf dem Tisch für Zeit. : P
Vallentin
6
Beachten Sie die from datetime import datetime. Wenn Sie nur tun, müssen import datetimeSie verwendendatetime.datetime.now().strftime("%H:%M:%S.%f")
JBaczuk
33

Sie sehen die falsche Dokumentation. Das timeModul hat unterschiedliche Dokumentationen .

Sie können das datetimeModul folgendermaßen verwenden strftime:

>>> from datetime import datetime
>>>
>>> now = datetime.now()
>>> now.strftime("%H:%M:%S.%f")
'12:19:40.948000'
Jochen Ritzel
quelle
1
Hier ist der Link zur Dokumentation des Datetime-Moduls: docs.python.org/2/library/…
Mr Fooz
Danke für den Beitrag. Warum gibt es ein Datum / Uhrzeit- und Zeitmodul?
Tommy.carstensen
9

Mit Pythons timeModul können Sie keine Mikrosekunden erhalten %f.

Für diejenigen, die immer noch timenur mit Modulen arbeiten möchten , gibt es hier eine Problemumgehung:

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

Sie sollten so etwas wie 2017-01-16 16: 42: 34.625 EET erhalten (ja, ich verwende Millisekunden, da dies ziemlich ausreichend ist).

Fügen Sie den folgenden Code in eine Python-Konsole ein, um den Code in Details zu zerlegen:

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

Zur Verdeutlichung füge ich hier auch mein Python 2.7.12-Ergebnis ein:

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

Dies sollte die Arbeit erledigen

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

Es wird gedruckt

HH:MM:SS.microseconds so zB 14:38:19.425961

Salah Laaroussi
quelle
5

Sie können timemit seiner time()Funktion auch eine Mikrosekundengenauigkeit vom Modul erhalten .
( time.time()Gibt die Zeit in Sekunden seit der Epoche zurück. Ihr Bruchteil ist die Zeit in Mikrosekunden, was Sie wollen.)

>>> 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
quelle
1
Ausgezeichnet. Danke für deine Hilfe. Ich habe es geschafft, die Dinge zum Laufen zu bringen, habe jedoch einen merkwürdigen Fehler gefunden, der bedeutet, dass Mikrosekunden nicht angezeigt werden, wenn das Skript als sudo auf einem bestimmten cset ausgeführt wird. Wenn ich mich jedoch als sudo anmelde, bevor ich versuche, es auf einem bestimmten cset auszuführen. Seltsam.
user820924
4

Wenn das "% f" für Mikrosekunden nicht funktioniert, verwenden Sie bitte die folgende Methode:

import datetime

def getTimeStamp():
    dt = datetime.datetime.now()
    return dt.strftime("%Y%j%H%M%S") + str(dt.microsecond)
user2189872
quelle
3
Dies funktioniert nicht, wenn die dt.microsecond weniger als 6 Stellen hat.
M456
3
Dies war die einzige Lösung, die tatsächlich für mich funktioniert hat. In Jython unter Windows scheint% f immer ein Literal% f zu drucken. Ich wollte Millisekunden, also benutzte ich str (dt.microsecond) [0: 3]
Ed Randall
1
str (dt.microsecond) [0: 3] kann zu einem falschen Ergebnis führen (z. B. 300 Mikrosekunden sind 0,300 Millesekunden, aber es werden 300 gedruckt!)
cabbi
3
"% 03d"% int (dt.microsecond / 1000) -> dies gibt die Millsekunden und nicht die Mikrosekunden aus
cabbi
0

Wenn Sie Geschwindigkeit wollen, versuchen Sie dies:

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

Wo precist Präzision - wie viele Dezimalstellen möchten Sie. Bitte beachten Sie, dass die Funktion keine Probleme mit führenden Nullen im Bruchteil hat, wie einige andere hier vorgestellte Lösungen.

mato
quelle
-1

Wenn Sie eine Ganzzahl möchten, versuchen Sie diesen Code:

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

Ausgabe:

1545474382803
Rafal Enden
quelle