2013-09-26 4 views
2

Я ищу для анализа даты из строки. Эта строка может содержать разные форматы, о которых я не знаю заранее.Элегантный способ анализа дат в python

from datetime import datetime 

try: 
    return datetime.strptime(text, '%m/%d/%Y')) 
except: 
    try: 
     return datetime.strptime(text, '%m/%d/%y')) 
    except: 
     try: 
      return datetime.strptime(text, '%Y/%m/%d')) 
     except: 
      try: 
       return datetime.strptime(text, '%b%d/%Y')) 
      except: 
       return None 

Очевидно, это выглядит слишком подробным. Я уверен, что лучше использовать карту, но мне бы очень хотелось услышать ваше мнение - я ненавижу изобретать колесо.

+6

Вы могли бы по крайней мере использовать цикл. –

+1

Проверьте, что http://stackoverflow.com/questions/7048828/how-can-i-parse-multiple-unknown-date-formats-in-python – Rami

+0

По какой-то причине я не хотел бы использовать dateutils.parse. Допустим, у меня есть небольшой набор форматов, как описано. Цикл определенно лучше. – martincho

ответ

6
from datetime import datetime 

def getdate(text): 
    formats = ('%m/%d/%Y', '%m/%d/%y', '%Y/%m/%d', '%b%d/%Y') 
    for format in formats: 
     try: 
      return datetime.strptime(text, format) 
     except: 
      pass 
4

Как насчет переплетения предоставленных форматов приоритетов?

from datetime import datetime 

def convert(text): 
    for format in [ '%m/%d/%Y', '%m/%d/%y', '%Y/%m/%d', '%b%d/%Y' ]: 
     try: 
      return datetime.strptime(text, format) 
     except: 
      continue 
    return None 
+0

Исправьте 'SyntaxError' в операторе return, укажите исключение в' except' (которое проглотило вышеприведенный SyntaxError) и что 'continue' может просто быть' pass' :) –

+0

Будет '.strptime()' ever поднимать что-нибудь помимо «ValueError»? –

+0

Он может также подняться 'TypeError', если мы назовем его' strptime (None, '% m /% d') ', и я предполагаю, что в некоторых редких случаях также исключения памяти – lejlot

Смежные вопросы