2009-02-10 14 views
14

Ich habe eine Textdatei mit vielen Datetime Strings in Isoformat. Die Saiten sind ähnlich wie diese:Parsing Datetime Strings mit Mikrosekunden

'2009-02-10 16: 06: 52,598800'

Diese Saiten wurden mit str(datetime_object) erzeugt. Das Problem ist, dass aus irgendeinem Grund, str(datetime_object) ein anderes Format erzeugt, wenn der Datetime-Objekt gesetzt Mikrosekunden auf Null und einige Zeichenketten wie folgt aussehen:

‚2009-02-10 16.06.52‘

Wie kann ich diese Zeichenfolgen analysieren und in eine datetime object konvertieren?

Es ist sehr wichtig, alle Daten im Objekt zu erhalten, einschließlich Mikrosekunden.

Ich muss verwenden Python 2.5, ich habe festgestellt, dass die Format-Anweisung %f für Mikrosekunden nicht in 2.5 existiert.

Antwort

21

Alternativ:

from datetime import datetime 

def str2datetime(s): 
    parts = s.split('.') 
    dt = datetime.strptime(parts[0], "%Y-%m-%d %H:%M:%S") 
    return dt.replace(microsecond=int(parts[1])) 

strptime Mit selbst das Datum/Zeit-String zu analysieren (also keine Notwendigkeit, (für eine Regex).

+0

Vielen Dank für diese Antwort! Ich würde vorschlagen, die letzte Zeile zu ändern: return dt.replace (Mikrosekunde = int (1000 * float ('0' + Teile [1]))) dies behandelt alle Fälle korrekt, wie z. '2017-03-16 21: 20: 57,31' , die 310us anstatt 31us geben sollte. – denizb

5

Jemand hat bereits einen Fehler mit diesem Problem gemeldet: Issue 1982. Da Sie dies mit Python 2.5 benötigen, müssen Sie den Wert manuell analysieren und dann das datetime-Objekt manipulieren.

2

Es ist vielleicht nicht die beste Lösung sein, aber Sie können einen regulären Ausdruck verwenden:

m = re.match(r'(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})(?:\.(\d{6}))?', datestr) 
dt = datetime.datetime(*[int(x) for x in m.groups() if x]) 
10

Verwenden Sie das Dateutil-Modul. Es unterstützt eine viel größere Auswahl an Datums- und Zeitformaten als die eingebauten Python-Formate.

Sie werden dateutil zu easy_install müssen für den folgenden Code arbeiten:

in
from dateutil.parser import parser 

p = parser() 
datetime_with_microseconds = p.parse('2009-02-10 16:06:52.598800') 
print datetime_with_microseconds.microsecond 

Ergebnisse:

598799 
+0

+1 dateutil den ganzen Weg – Yarin