Извлечение даты из строки в Python - PullRequest
59 голосов
/ 18 июля 2010

Как мне извлечь дату из строки типа "monkey 2010-07-10 love banana"? Спасибо!

Ответы [ 5 ]

126 голосов
/ 18 июля 2010

Использование python-dateutil :

In [1]: import dateutil.parser as dparser

In [18]: dparser.parse("monkey 2010-07-10 love banana",fuzzy=True)
Out[18]: datetime.datetime(2010, 7, 10, 0, 0)

Неправильные даты поднимают ValueError:

In [19]: dparser.parse("monkey 2010-07-32 love banana",fuzzy=True)
# ValueError: day is out of range for month

Может распознавать даты во многих форматах:

In [20]: dparser.parse("monkey 20/01/1980 love banana",fuzzy=True)
Out[20]: datetime.datetime(1980, 1, 20, 0, 0)

Обратите внимание, что он делает предположение, если дата неоднозначна:

In [23]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True)
Out[23]: datetime.datetime(1980, 10, 1, 0, 0)

Но способ разбора неоднозначных дат настраивается:

In [21]: dparser.parse("monkey 10/01/1980 love banana",fuzzy=True, dayfirst=True)
Out[21]: datetime.datetime(1980, 1, 10, 0, 0)
54 голосов
/ 18 июля 2010

Если дата указана в фиксированной форме, вы можете просто использовать регулярное выражение для извлечения даты и datetime.datetime.strptime для анализа даты:

match = re.search(r'\d{4}-\d{2}-\d{2}', text)
date = datetime.strptime(match.group(), '%Y-%m-%d').date()

В противном случае, если дата указана в произвольной форме, вы не сможете легко ее извлечь.

15 голосов
/ 27 июля 2016

Для извлечения даты из строки в Python;лучший доступный модуль - это модуль datefinder .

Вы можете использовать его в своем проекте Python, выполнив простые шаги, указанные ниже.

Шаг 1: Установите пакет datefinder

pip install datefinder

Шаг 2. Используйте его в своем проекте

import datefinder

input_string = "monkey 2010-07-10 love banana"
# a generator will be returned by the datefinder module. I'm typecasting it to a list. Please read the note of caution provided at the bottom.
matches = list(datefinder.find_dates(input_string))

if len(matches) > 0:
    # date returned will be a datetime.datetime object. here we are only using the first match.
    date = matches[0]
    print date
else:
    print 'No dates found'

примечание: , если вы ожидаете большое количество совпадений;тогда приведение типа к списку не будет рекомендуемым способом, так как это приведет к значительному снижению производительности.

0 голосов
/ 07 августа 2018

Если вам известна позиция объекта даты в строке (например, в файле журнала), вы можете использовать .split () [index], чтобы извлечь дату, не зная полностью формат.

Например:

>>> string = 'monkey 2010-07-10 love banana'
>>> date = string.split()[1]
>>> date
'2010-07-10'
0 голосов
/ 21 апреля 2018

Используя Pygrok, вы можете определить абстрактные расширения для синтаксиса регулярных выражений.

Пользовательские шаблоны могут быть включены в регулярное выражение в формате %{PATTERN_NAME}.

Вы также можете создать метку для этого шаблона, разделив ее двоеточием: %s{PATTERN_NAME:matched_string}.Если шаблон соответствует, значение будет возвращено как часть результирующего словаря (например, result.get('matched_string'))

Например:

from pygrok import Grok

input_string = 'monkey 2010-07-10 love banana'
date_pattern = '%{YEAR:year}-%{MONTHNUM:month}-%{MONTHDAY:day}'

grok = Grok(date_pattern)
print(grok.match(input_string))

Полученное значение будет словарем:

{'month': '07', 'day': '10', 'year': '2010'}

Если date_pattern не существует в input_string, возвращаемое значение будет None.Напротив, если в вашем шаблоне нет меток, он вернет пустой словарь {}

Ссылки:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...