2016-07-11 16 views
3

Ich habe eine Zeichenfolge 19:04:01:94891.Kann Mikrosekunden nicht korrekt mit strptime analysieren()

Als ich dies passieren zu datetime.datetime.strptime() wie:

datetime.strptime('19:04:01:94891', "%H:%M:%S:%f") 

ich folgendes Ergebnis:

datetime.datetime(1900, 1, 1, 19, 4, 1, 948910) 

Allerdings erwarte ich das Ergebnis sein:

datetime.datetime(1900, 1, 1, 19, 4, 1, 94891) 

Der Unterschied ist, in microseconds.

Wie kann ich das erwartete Ergebnis erhalten, ohne die Zeichenfolge zu ändern, während ich die Zeichenfolge aus einer Datei lese?

+0

Nicht wirklich möglich, ohne den String zu ändern: ["Bei Verwendung der Methode' strptime() 'akzeptiert die'% f'-Direktive eine bis sechs Ziffern und ** Zero-Pads auf der rechten Seite **. "] (https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior) –

+0

was schlagen Sie vor? Nachbearbeitung ist eine mögliche und einfache Lösung. Wenn Sie vorprozessieren möchten, stimme ich @AshwiniChaudhary zu. –

Antwort

2

Das Problem ist, dass Ihre Eingabe nicht mit Nullen aufgefüllt ist, so dass das Problem noch schlimmer wäre, wenn wir an, sind etwa 11 Mikrosekunden. Lassen Sie uns das Problem beheben es Quelle ist, und reinigen Sie die Eingabe nach oben zuerst:

def fixMicroseconds(timestamp): 
    parts = timestamp.split(':') 

    return ':'.join(
     parts[:-1] + ['{:06d}'.format(int(parts[-1]))] 
    ) 

Jetzt wird es mit Nullen aufgefüllt zu 6 Stellen sein, wie Python vorzieht.

Hier ist ein Beispiel für diese Arbeiten:

In [1]: def fixMicroseconds(timestamp): 
    ....:  parts = timestamp.split(':') 
    ....: 
    ....:  return ':'.join(
    ....:   parts[:-1] + ['{:06d}'.format(int(parts[-1]))] 
    ....: ) 
    ....: 

In [2]: fixMicroseconds('19:04:01:94891') 
Out[2]: '19:04:01:094891' 

In [3]: fixMicroseconds('19:04:01:13') 
Out[3]: '19:04:01:000013' 

In [4]: datetime.datetime.strptime(fixMicroseconds('19:04:01:94891'), "%H:%M:%S:%f") 
Out[4]: datetime.datetime(1900, 1, 1, 19, 4, 1, 94891) 

Sie müssen wirklich die Eingabe vor dem Aufruf von strptime() aufzuräumen, denn das ist, was strptime() erwartet (6 Stellen).

1

Aus der Dokumentation auf strptime():

Wenn es mit dem strptime() Verfahren eingesetzt werden, nimmt die %f Richtlinie von 5.59 Ziffern und Null-Pads auf der rechten Seite.

Wenn die Zeichenfolge immer eine 5-stellige Mikrosekunden Nummer enthält, können Sie die resultierende Zahl nach dem Parsen der Zeichenfolge gestutzt:

>>> from datetime import datetime 
>>> dt = datetime.strptime("19:04:01:94891", "%H:%M:%S:%f") 
>>> dt.replace(microsecond=dt.microsecond//10) 
datetime.datetime(1900, 1, 1, 19, 4, 1, 94891) 

Eine „richtige“ Lösung auf Null-Pad würde die Zahl der Mikrosekunden. Da Sie bereits ein Beispiel für python2 haben, hier ist man mit python3 des erweiterten auspacken:

>>> *a, b = "19:04:01:94891".split(":") 
>>> c = ":".join(a + ["{:0>6}".format(b)]) 
>>> c 
'19:04:01:094891' 
>>> datetime.strptime(c, "%H:%M:%S:%f") 
datetime.datetime(1900, 1, 1, 19, 4, 1, 94891) 
Verwandte Themen