2009-02-10 15 views
14

Mam plik tekstowy z wieloma ciągami datetime w isoformat. Struny są podobne do tego:Parsowanie ciągów datetime z mikrosekundami

'2009-02-10 16: 06: 52.598800'

te struny zostały wygenerowane przy użyciu str(datetime_object). Problemem jest to, że z jakiegoś powodu, str(datetime_object) generuje inny format, gdy obiekt datetime mikrosekund został ustawiony na zero, a niektóre ciągi wyglądać następująco:

„2009-02-10 16:06:52”

Jak mogę przeanalizować te ciągi i przekonwertować je na datetime object?

Bardzo ważne jest, aby uzyskać wszystkie dane w obiekcie, w tym mikrosekundy.

Muszę użyć Python 2.5, Zauważyłem, że dyrektywa formatu %f dla mikrosekund nie istnieje w 2.5.

Odpowiedz

21

Alternatywnie:

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])) 

Korzystanie samego strptime do analizowania data/czas ciąg (a więc nie ma potrzeby wymyślać przypadki narożne dla regexu).

+0

Dzięki za odpowiedź! Proponuję zmienić ostatnią linię na: return dt.replace (microsecond = int (1000 * float ('0' + parts [1]))) to obsługuje wszystkie sprawy poprawnie, np. "2017-03-16 21: 20: 57.31 ' który powinien dać 310us zamiast 31us. – denizb

5

Ktoś już zgłosił błąd z tym problemem: Issue 1982. Ponieważ potrzebujesz tego do pracy z pythonem 2.5, musisz sparsować wartość ręcznie, a następnie manipulować obiektem datetime.

2

To może nie być najlepszym rozwiązaniem, ale można użyć wyrażenia regularnego:

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

Użyj modułu dateutil. Obsługuje znacznie szerszy zakres formatów daty i czasu niż te wbudowane w Pythonie.

Musisz easy_install dateutil na następujący kod do pracy:

from dateutil.parser import parser 

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

skutkuje:

598799 
+0

+1 dateutil do końca – Yarin