Проверьте, имеет ли строка дату, любой формат

Как проверить, может ли строка обрабатываться на дату?

  • 19 января 1990 г.
  • 19 января 1990 г.
  • 19 января 1990 года
  • 01/19/1990
  • 01/19/90
  • 1990
  • Январь 1990 г.
  • January1990

Это все допустимые даты. Если есть какая-либо озабоченность в связи с отсутствием места между вещами в элементе № 3 и последним пунктом выше, это может быть легко устранено путем автоматической вставки пробела между буквами / символами и цифрами, если это необходимо.

Но во-первых, основы:

Я попытался включить его в оператор if statement :

 if datetime.strptime(item, '%Y') or datetime.strptime(item, '%b %d %y') or datetime.strptime(item, '%b %d %Y') or datetime.strptime(item, '%B %d %y') or datetime.strptime(item, '%B %d %Y'): 

Но это в блоке try-exception и продолжает возвращать что-то вроде этого:

16343 time data 'JUNE1890' does not match format '%Y'

Если он не выполнил первое условие в if statement .

Чтобы уточнить, мне действительно не нужна ценность даты – я просто хочу знать, если это так. В идеале это было бы примерно так:

 if item is date: print date else: print "Not a date" 

Есть какой-либо способ сделать это?

Посмотрите на функцию parse в dateutils.parser . Он способен разбирать почти любую строку для объекта datetime .

Если вы просто хотите знать, может ли конкретная строка представлять дату, вы можете попробовать следующую функцию:

 from dateutil.parser import parse def is_date(string): try: parse(string) return True except ValueError: return False 

Тогда у вас есть:

 >>> is_date("1990-12-1") True >>> is_date("xyznotadate") False 

Одно примечание: parse может распознавать некоторые строки как даты, которые вы не хотите рассматривать как даты, например, "23, 4" будет анализироваться как datetime.datetime(2023, 4, 16, 0, 0) . Возможно, вам потребуются дополнительные проверки, если вы хотите поймать эти случаи.

Если вы хотите проанализировать эти конкретные форматы, вы можете просто сопоставить их со списком форматов:

 txt='''\ Jan 19, 1990 January 19, 1990 Jan 19,1990 01/19/1990 01/19/90 1990 Jan 1990 January1990''' import datetime as dt fmts = ('%Y','%b %d, %Y','%b %d, %Y','%B %d, %Y','%B %d %Y','%m/%d/%Y','%m/%d/%y','%b %Y','%B%Y','%b %d,%Y') parsed=[] for e in txt.splitlines(): for fmt in fmts: try: t = dt.datetime.strptime(e, fmt) parsed.append((e, fmt, t)) break except ValueError as err: pass # check that all the cases are handled success={t[0] for t in parsed} for e in txt.splitlines(): if e not in success: print e for t in parsed: print '"{:20}" => "{:20}" => {}'.format(*t) 

Печать:

 "Jan 19, 1990 " => "%b %d, %Y " => 1990-01-19 00:00:00 "January 19, 1990 " => "%B %d, %Y " => 1990-01-19 00:00:00 "Jan 19,1990 " => "%b %d,%Y " => 1990-01-19 00:00:00 "01/19/1990 " => "%m/%d/%Y " => 1990-01-19 00:00:00 "01/19/90 " => "%m/%d/%y " => 1990-01-19 00:00:00 "1990 " => "%Y " => 1990-01-01 00:00:00 "Jan 1990 " => "%b %Y " => 1990-01-01 00:00:00 "January1990 " => "%B%Y " => 1990-01-01 00:00:00