Измените параметры dateutil.parser.parse, чтобы исправить ошибочную идентификацию даты - PullRequest
0 голосов
/ 18 октября 2019

Dateutil parse неверно определяет строку как дату, несмотря на изменение свойства parseinfo.JUMP

Я делаю функцию, которая определяет, является ли значение датой (учитывая различные форматы). dateutil.parser.parse отлично подходит для этого, но он неправильно идентифицирует некоторые мои данные как дату.

В частности, он корректирует 'ad-3' до datetime.datetime (2019, 10, 3, 0, 0), что является 3-м числом текущего месяца и года.

IВы пытались изменить parseinfo для исключения 'ad'

На основании документации по dateutil команда parse принимает аргумент parseinfo.

Я считаю, что моя проблема в том, что класс parseinfo по умолчанию, который передается в parse, содержит в своем свойстве jump слово «ad». Я попытался создать свой собственный класс parseinfo, изменить свойство списка переходов и передать его на анализ, но проблема не устранена.

from dateutil import parser

def check_format(val, pi = parser.parserinfo()):

    # Check date
    try:
        parser.parse(val, parserinfo=pi)
        return 'date'
    except ValueError:
        return 'Not date'

default_pi = parser.parserinfo()
my_pi = parser.parserinfo()
my_pi.JUMP = [j for j in my_pi.JUMP if j not in ['ad']]

print('Default JUMP List:')
print(default_pi.JUMP) # Print the default JUMP list and you can se ad is part of the list

print('My Corrected JUMP List')
print(my_pi.JUMP) # Print the modified JUMP list and you see that we have successfully excluded 

print('Return using default JUMP list:')
print(check_format('ad-3')) # Using default parserinfo

print('Return using my JUMP list:')
print(check_format('ad-3', my_pi)) # Using my parserinfo

print('Control test with a normal string:')
print(check_format('sad-3', my_pi))

Проблема:

check_format('ad-3', my_pi) возвращает «date», несмотря на то, что передан экземпляр parserinfo, который исключает «ad» из своего списка.

В качестве элемента управления я передал похожую строку «sad-3», и результат такой, как и ожидалось: «Не дата».

Вывод:

Список JUMP по умолчанию: ['', '.', ',', ';', '-', '/', "'",' at ','on', 'and', 'ad', 'm', 't', 'of', 'st', 'nd', 'rd', 'th']

Мой исправленный список JUMP['', '.', ',', ';', '-', '/', "'",' at ',' on ',' and ',' m ',' t ',' of',' st ',' nd ',' rd ',' th ']

Возврат с использованием списка JUMP по умолчанию: дата

Возврат с использованием моего списка JUMP: дата

Контрольный тест с нормальной строкой: Не дата

...