Как разобрать даты с годами до 1000 с помощью dateparser? - PullRequest
1 голос
/ 04 апреля 2019

Я пытаюсь использовать dateparser для разбора дат с годами ранее, чем 1000, с менее чем четырьмя цифрами.

import dateparser

value = "july 900"
result = dateparser.parse(value)
result is None  # True

Сначала я подумал, что это связано с проблемой, упомянутой здесь: Использовать datetime.strftime () в годы до 1900 года? («Требуется год> = 1900») , поскольку в некоторых случаях с определенными входными данными (например, просто 900) результатом были текущий день и месяц в сочетании с годом 1900. Но после еще нескольких испытаний со случайными датами и относительными выражениями я заметил, что dateparser может выводить даты раньше, чем 1000, затем я понял, что если я добавлю ноль к году, результат будет правильным.

import dateparser

value = "july 0900"
result = dateparser.parse(value)
result is None  # False
result  # datetime.datetime(900, 7, 4, 0, 0)

Я нашел это в поиске решения: https://github.com/scrapinghub/dateparser/issues/410 но последний комментарий оставил мне больше вопросов, чем ответов, так как мне не удалось найти способ передать пользовательский парсер внутреннему пользователю dateutil.parser из dateparser.

Мое текущее решение состоит в том, чтобы искать регулярные выражения трехзначного года, используя что-то похожее на это: (.* +| *|.+[\/\-.]{1,})([1-9][0-9]{2,})( *| +.*|[\/\-.]{1,}.+) и вставлять их на место.

Есть ли лучший способ сделать это?

EDIT:

Существует ли элегантное решение для анализа дат до нашей эры (например, до н.э.)? (кажется, что dateparser клавиша настроек SUPPORT_BEFORE_COMMON_ERA мало что делает в этом отношении, а все остальные, похоже, не связаны)

Так что это можно использовать для археологических раскопок.

1 Ответ

0 голосов
/ 04 апреля 2019

Не используйте регулярные выражения с датами. Это трудно, и угловые корпуса сведут вас с ума. Модуль dateutil делает то, что вы хотите правильно.

>>> from dateutil import parser
>>> value = "july 900"
>>> parser.parse(value)
datetime.datetime(900, 7, 4, 0, 0)

Это не решение для дат до текущей эры. Это потому, что dateutil и dateparser оба работают с datetime с и datetime с, не принимают годы меньше 1.

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