2009-03-30 6 views
147

Ich bin in der Lage Strings mit time.strptime mit Datum/Zeit zu analysierenWie kann ich einen Zeitstring, der Millisekunden enthält, mit Python 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 Zeit Zeichenfolge 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 

Antwort

218

Python 2.6 hat ein neues strftime/strptime Makro %f, die Mikrosekunden hat. Nicht sicher, ob dies irgendwo dokumentiert ist. Aber wenn Sie mit 2.6 oder 3.0 können Sie dies tun:

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

Edit: Ich habe nie wirklich arbeiten mit dem time Modul, so dass ich dies nicht auf den ersten bemerken, aber es scheint, dass time.struct_time speichert nicht tatsächlich Millisekunden/Mikrosekunden. Sie können besser mit datetime, wie dies:

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

Danke http://docs.python.org/library/datetime.html: Neu in Version 2.6: Zeit-und Datetime-Objekte unterstützen einen% f-Format-Code, der auf die Anzahl der Mikrosekunden im Objekt erweitert wird, gepolstert auf der Links zu sechs Plätzen. – ilkinulas

+5

Woa Ich kann sagen, dass die Python-Dokumente aktualisiert werden müssen. [Dokumente für das Zeitmodul] (http://docs.python.org/library/time.html#time.strftime) sagt nichts über '% f'. – phunehehe

+1

hm, null-gepolstert am * links * wäre falsch, nein? –

1

Mein erster Gedanke war, es zu versuchen vorbei '30/09.03 16: 31: (. Mit einem Punkt statt einem Doppelpunkt zwischen den Sekunden und Millisekunden) 32,123' Aber das hat nicht funktioniert. Ein kurzer Blick in die Dokumentation zeigt an, dass Sekundenbruchteile in jedem Fall ignoriert werden ...

Ah, Versionsunterschiede. Das war reported as a bug und jetzt in 2.6+ können Sie "% S.% f" verwenden, um es zu analysieren.

+0

Das funktioniert nicht; time.strptime macht keine Millisekunden. – DNS

+0

Ja, das habe ich gesehen, als ich es ausprobiert habe, also den Schnitt. – MarkusQ

1

von Python-Mailinglisten: parsing millisecond 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 verwendet reguläre Ausdrücke, um die Ausnahme zu behandeln, die ausgelöst wird, und führt dann einige Berechnungen durch.

Sie könnten auch versuchen, die regulären Ausdrücke und Berechnungen im Voraus zu tun, bevor Sie es zu strptime übergeben.

+0

Ja, ich kenne diesen Thread. Aber ich suche nach einem einfacheren Weg. Gibt es ein Modul in der Standart-Python-Bibliothek, das die Zeitanalyse mit Millisekunden durchführt? – ilkinulas

3

den Code zu geben, dass nstehr's answer bezieht sich auf (von its source):

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 
12

Ich weiß, das ist eine ältere Frage, aber ich bin immer noch mit Python 2.4.3 und ich brauchte einen besseren Weg zur Umwandlung der Datenkette zu finden, eine Datetime.

Die Lösung, wenn Datetime nicht% f unterstützt und ohne einen Versuch zu benötigen/ausgenommen ist:

(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 ist für die Eingabezeichenfolge funktioniert "2010-10-06 09: 42: 52,266000"

+1

'dt.replace (microsecond = int (mSecs)) ' – haridsv

+0

Dies gilt für Python 2.5 und früher. Python 2.6 unterstützt strptime '% f' – smci

0

Für python 2 i tat dies

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

druckt Zeit "% H:% M:% S" (. vor und nach dem), die time.time spaltet(), um zwei Teil xxxxxxx.xx und da .xx meine Millisekunden sind, füge ich das zweite Sub hinzu String in meinem "% H:% M:% S"

Hoffnung, den Sinn :) Beispiel Ausgabe macht:

13:31:21.72 Blink 01


13:31:21.81 END OF BLINK 01


13: 31: 26,3 01 Blink


13: 31: 26.39 END OF 01 BLINK


13: 31: 34.65 Startbahn 01