Python 使用dateutil.parser.parse为两位数年份日期抛出ValueError

Python 使用dateutil.parser.parse为两位数年份日期抛出ValueError,python,date,parsing,python-dateutil,2-digit-year,Python,Date,Parsing,Python Dateutil,2 Digit Year,在进行一些数据清理时,我注意到dateutil.parser.parse无法拒绝某个格式错误的日期,认为其中的第一个数字是两位数的年份。这个图书馆可以被强制将两位数的年份视为无效吗 例如: from dateutil.parser import parse parse('22-23 February') 产出: datetime.datetime(2022, 2, 23, 0, 0) 我通过将自定义的dateutil.parser.parserinfo对象通过parserinfo参数传递到d

在进行一些数据清理时,我注意到
dateutil.parser.parse
无法拒绝某个格式错误的日期,认为其中的第一个数字是两位数的年份。这个图书馆可以被强制将两位数的年份视为无效吗

例如:

from dateutil.parser import parse
parse('22-23 February')
产出:

datetime.datetime(2022, 2, 23, 0, 0)

我通过将自定义的
dateutil.parser.parserinfo
对象通过
parserinfo
参数传递到
dateutil.parser.parse
来解决这个问题。幸运的是,
dateutil.parser.parserinfo
有一个
convertyear
方法,可以在派生类中重载该方法,以便在年份上执行额外的验证

from dateutil.parser import parse, parserinfo

class NoTwoDigitYearParserInfo(parserinfo):
    def convertyear(self, year, century_specified=False):
        if year < 100 and not century_specified:
            raise ValueError('Two digit years are not supported.')
        return parserinfo.convertyear(self, year, century_specified)

parse('22-23 February', parserinfo = NoTwoDigitYearParserInfo())
从dateutil.parser导入解析,parserinfo
类NoTwoDigitYearParserInfo(parserinfo):
def CONVERTORYEAR(自身、年份、指定的世纪=False):
如果年份<100且未指定世纪,则:
raise VALUE ERROR('不支持两位数年份')
返回parserinfo.convertyear(指定了自身、年份、世纪)
parse('2月22-23日',parserinfo=NoTwoDigitYearParserInfo())
产出:

datetime.datetime(2022, 2, 23, 0, 0)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
parse中的文件“/usr/local/lib/python3.5/site packages/dateutil/parser.py”,第1162行
返回解析器(parserinfo).parse(timestr,**kwargs)
文件“/usr/local/lib/python3.5/site packages/dateutil/parser.py”,第552行,在parse中
res,跳过的令牌=self.\u解析(timestr,**kwargs)
文件“/usr/local/lib/python3.5/site packages/dateutil/parser.py”,第1055行,在
如果没有信息验证(res):
文件“/usr/local/lib/python3.5/site packages/dateutil/parser.py”,第360行,在validate中
res.year=自转换年(res.year,res.century_指定)
文件“”,第4行,年份
ValueError:不支持两位数的年份。

不错。如果找不到年份,我用它来防止年份默认为当前年份。不客气!另一个选项是将
default=datetime(1900,1,1)
传递给
dateutil.parser.parse
(或您希望的任何年份),然后用默认年份处理日期。实际上,我重写了
validate
方法,如果res.year为None:return False,否则返回super…,看起来很整洁。