2015-06-01 10 views
19

Teraz mam:pyton Format strptime z opcjonalnymi bitów

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 

Działa to doskonale, chyba jestem przekształcając ciąg, który nie ma mikrosekund. Jak mogę określić, że mikrosekundy są opcjonalne (i powinny być uważane za 0, jeśli nie są w łańcuchu)?

Odpowiedz

17

Można użyć try/except bloku:

try: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
except ValueError: 
    timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S') 
9

co właśnie dołączenie go, jeśli nie istnieje?

if '.' not in date_string: 
    date_string = date_string + '.0' 

timestamp = datetime.strptime(date_string, '%Y-%m-%d %H:%M:%S.%f') 
2

Wolę używać dopasowań regularnych zamiast try i except. Pozwala to na wiele niepowodzeń w akceptowalnych formatach.

# full timestamp with milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d+Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%S.%fZ") 

# timestamp missing milliseconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%M:%SZ") 

# timestamp missing milliseconds & seconds 
match = re.match(r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}Z", date_string) 
if match: 
    return datetime.strptime(date_string, "%Y-%m-%dT%H:%MZ") 

# unknown timestamp format 
return false 

Nie zapomnij zaimportować "re" oraz "datetime" dla tej metody.

0
datetime(*map(int, re.findall('\d+', date_string))) 

można analizować zarówno '%Y-%m-%d %H:%M:%S.%f' i '%Y-%m-%d %H:%M:%S'. Jest zbyt permisywny, jeśli twoje wejście nie jest filtrowane.

Jest szybka i brudna, ale czasami strptime() jest zbyt wolny. Można go użyć, jeśli wiesz, że dane wejściowe mają oczekiwany format daty.

+0

Daje to nieprawidłowe wyniki, jeśli w 'date_string', końcowe zera są pominięte w części mikrosekundy. – jez

+1

@jez: tak, dlatego powiedziałem, że jest "zbyt liberalne". Działa tylko wtedy, gdy wejście ma oczekiwany format (brak lub 6 cyfr dla mikrosekund). 2- o twojej edycji: spójrz na pytanie: 'datetime' to klasa tutaj, a nie moduł. – jfs