2012-02-29 16 views
22

Funkcja uzyskiwania datetime z ciągu znaków, datetime.strptime(date_string, format) wymaga formatu ciągu jako drugiego argumentu. Czy istnieje sposób na zbudowanie datetime z ciągów bez znajomości dokładnego formatu, a Python najlepiej to odgadnąć?datetime z ciągu w Pythonie, najlepiej zgadujący format ciągu znaków

+1

możliwe duplikat [Czy istnieje biblioteka Pythona do parsowania daty i godziny z języka naturalnego?] (Http://stackoverflow.com/questions/1495487/is-there-any-python-library-for -parsing-date-and-times-from-a-natural-language) –

+4

Rozróżnianie pomiędzy mm/dd/rrrr a dd/mm/rrrr jest interesującym problemem, z katastrofalnymi skutkami, jeśli źle zrobisz. –

+0

Zależy od tego, jak niedokładnie masz na myśli, kiedy mówisz "bez dokładnego formatu". Czy możesz podać przykłady rodzajów wejść, które chcesz obsłużyć? Lub, czy możesz potencjalnie uzyskać częściowe informacje o formacie (np. Czy rok ma 2 lub 4 cyfry, czy też miesiąc poprzedza dzień, czy odwrotnie)? Bez przynajmniej podstawowych informacji, nawet osoba nie może zrobić tego, o co prosisz. Czy 01.02.12 lutego 1 lutego 2012, 2 stycznia 2012, 12 lutego 2001, 2 grudnia 2001, czy coś innego? –

Odpowiedz

4

Wcześniej, zanim zostałem Pythonem, byłem perlem. Jedną z rzeczy, które zawsze mi brakowało, ale nie widziałem nic w pobliżu, jest Date::Manip. Moduł ten może wyodrębnić dobry znacznik czasu ze smużenia przekąsek. Prawie podejrzewam, że to autor zawarł umowę z Diabłem.

Mam natknąć się na kilka rzeczy, które mają pchnięć na to w Pythonie:

Jeśli znajdź coś lepszego, ale chciałbym o tym usłyszeć.

+0

Dzięki za rekomendacje- zobacz moją odpowiedź, Myślę, że znalazłem własną odpowiedź z biblioteką [dateutil] (http://pypi.python.org/pypi/python-dateutil/1.5). – Yarin

8

Może odejść z prostą funkcją, jeśli tylko sprawdza daty.

def get_date(s_date): 
    date_patterns = ["%d-%m-%Y", "%Y-%m-%d"] 

    for pattern in date_patterns: 
     try: 
      return datetime.datetime.strptime(s_date, pattern).date() 
     except: 
      pass 

    print "Date is not in expected format: %s" %(s_date) 
    sys.exit(0) 
+0

Znacznie szybciej niż przy użyciu dateutil pod warunkiem, że format daty jest objęty. – rbennell

Powiązane problemy