it-swarm.com.de

Wie kann ich einen Zeitstring mit Millisekunden darin mit Python analysieren?

Ich kann Strings, die Datum/Uhrzeit enthalten, mit time.strptime analysieren.

>>> import time
>>> time.strptime('30/03/09 16:31:32', '%d/%m/%y %H:%M:%S')
(2009, 3, 30, 16, 31, 32, 0, 89, -1)

Wie kann ich eine Zeitzeichenfolge analysieren, die Millisekunden enthält?

>>> time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib/python2.5/_strptime.py", line 333, in strptime
    data_string[found.end():])
ValueError: unconverted data remains: .123
170
ilkinulas

Python 2.6 fügte ein neues Strftime/Strptime-Makro %f hinzu, das Mikrosekunden erledigt. Nicht sicher, ob dies irgendwo dokumentiert ist. Wenn Sie jedoch 2.6 oder 3.0 verwenden, können Sie Folgendes tun:

time.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')

Edit: Ich arbeite nie wirklich mit dem Modul time, also habe ich das zunächst nicht bemerkt, aber time.struct_time speichert eigentlich keine Millisekunden/Mikrosekunden. Sie können datetime besser verwenden, wie folgt:

>>> from datetime import datetime
>>> a = datetime.strptime('30/03/09 16:31:32.123', '%d/%m/%y %H:%M:%S.%f')
>>> a.microsecond
123000
262
DNS

Ich weiß, dass dies eine ältere Frage ist, aber ich benutze immer noch Python 2.4.3 und ich musste einen besseren Weg finden, um die Datenzeichenfolge in eine datetime zu konvertieren.

Die Lösung, wenn datetime% f nicht unterstützt, und ohne try/mit Ausnahme von:

    (dt, mSecs) = row[5].strip().split(".") 
    dt = datetime.datetime(*time.strptime(dt, "%Y-%m-%d %H:%M:%S")[0:6])
    mSeconds = datetime.timedelta(microseconds = int(mSecs))
    fullDateTime = dt + mSeconds 

Dies funktioniert für die Eingabezeichenfolge "2010-10-06 09: 42: 52.266000"

12
Andrew Stern

Um den Code anzugeben, auf den nstehrs Antwort verweist (von seine Quelle ):

def timeparse(t, format):
    """Parse a time string that might contain fractions of a second.

    Fractional seconds are supported using a fragile, miserable hack.
    Given a time string like '02:03:04.234234' and a format string of
    '%H:%M:%S', time.strptime() will raise a ValueError with this
    message: 'unconverted data remains: .234234'.  If %S is in the
    format string and the ValueError matches as above, a datetime
    object will be created from the part that matches and the
    microseconds in the time string.
    """
    try:
        return datetime.datetime(*time.strptime(t, format)[0:6]).time()
    except ValueError, msg:
        if "%S" in format:
            msg = str(msg)
            mat = re.match(r"unconverted data remains:"
                           " \.([0-9]{1,6})$", msg)
            if mat is not None:
                # fractional seconds are present - this is the style
                # used by datetime's isoformat() method
                frac = "." + mat.group(1)
                t = t[:-len(frac)]
                t = datetime.datetime(*time.strptime(t, format)[0:6])
                microsecond = int(float(frac)*1e6)
                return t.replace(microsecond=microsecond)
            else:
                mat = re.match(r"unconverted data remains:"
                               " \,([0-9]{3,3})$", msg)
                if mat is not None:
                    # fractional seconds are present - this is the style
                    # used by the logging module
                    frac = "." + mat.group(1)
                    t = t[:-len(frac)]
                    t = datetime.datetime(*time.strptime(t, format)[0:6])
                    microsecond = int(float(frac)*1e6)
                    return t.replace(microsecond=microsecond)

        raise
3
Phil H

Für Python 2 habe ich das gemacht

print ( time.strftime("%H:%M:%S", time.localtime(time.time())) + "." + str(time.time()).split(".",1)[1])

es gibt die Uhrzeit "% H:% M:% S" aus, teilt die time.time () in zwei Teilstrings (vor und nach dem.) xxxxxxx.xx auf und da .xx meine Millisekunden sind, füge ich den zweiten Teilstring zu "%" hinzu. H:% M:% S

ich hoffe, das macht Sinn:) Beispielausgabe:

13: 31: 21,72 Blink 01


13: 31: 21.81 ENDE VON BLINK 01


13: 31: 26.3 Blink 01


13: 31: 26.39 ENDE VON BLINK 01


13: 31: 34,65 Startspur 01


1
Papatrexas

Mein erster Gedanke war, es zu versuchen '30/03/09 16: 31: 32.123 '(mit einem Punkt anstelle eines Doppelpunkts zwischen den Sekunden und den Millisekunden.) Aber das hat nicht funktioniert. Ein Blick auf die Dokumente zeigt an, dass Sekundenbruchteile auf jeden Fall ignoriert werden ...

Ah, Versionsunterschiede. Dies wurde als Fehler gemeldet und jetzt können Sie in 2.6+ "% S.% f" verwenden, um ihn zu analysieren.

1
MarkusQ

von Python-Mailinglisten: Parsing Millisekunden-Thread . Es gibt dort eine Funktion, die den Job zu erledigen scheint, obwohl es, wie in den Kommentaren des Autors erwähnt, eine Art Hack ist. Es verarbeitet reguläre Ausdrücke, um die ausgelöste Ausnahme zu behandeln, und führt dann einige Berechnungen durch.

Sie können auch versuchen, die regulären Ausdrücke und Berechnungen im Vorfeld auszuführen, bevor Sie sie an strptime übergeben.

1
nstehr

DNS Antwort oben ist eigentlich falsch. Das SO fragt nach Millisekunden, aber die Antwort bezieht sich auf Mikrosekunden. Leider gibt es in Python`s keine Direktive für Millisekunden, nur Mikrosekunden (siehe doc ). Sie können das Problem umgehen, indem Sie drei Nullen am Ende der Zeichenfolge anhängen und die Zeichenfolge als Mikrosekunden analysieren.

datetime.strptime(time_str + '000', '%d/%m/%y %H:%M:%S.%f')

wobei time_str wie 30/03/09 16:31:32.123 formatiert ist.

Hoffe das hilft.

0
Rafid