如何在Python中解析不完整日期的日期
我正在使用dateutil.parser解析日期,如果日期不完整,即1月1日(缺失年份)或2016年1月1日(缺失日期),我想抛出一个异常。到目前为止,我有以下几点如何在Python中解析不完整日期的日期,python,Python,我正在使用dateutil.parser解析日期,如果日期不完整,即1月1日(缺失年份)或2016年1月1日(缺失日期),我想抛出一个异常。到目前为止,我有以下几点 try: parse(date) return parse(date).isoformat() except ValueError: return 'invalid' 您可以使用类dateutil.parser.parser的私有方法\u parse来确定是否提供了日期、月份和年份。由于该方法是私有的,其
try:
parse(date)
return parse(date).isoformat()
except ValueError:
return 'invalid'
您可以使用类
dateutil.parser.parser
的私有方法\u parse
来确定是否提供了日期、月份和年份。由于该方法是私有的,其行为可能会发生变化,通常不建议在生产代码中使用其他类的私有方法,但在这种特殊情况下,使用它是最简单、最健壮的方法,因此它可能是正常的
修改后的代码如下所示:
from dateutil.parser import parser, parse
# Check if passed date is complete and valid
def is_date_complete (date, must_have_attr=("year","month","day")):
parse_res, _ = parser()._parse(date)
# If date is invalid `_parse` returns (None,None)
if parse_res is None:
return False
# For a valid date `_result` object is returned. E.g. _parse("Sep 23") returns (_result(month=9, day=23), None)
for attr in must_have_attr:
if getattr(parse_res,attr) is None:
return False
return True
## your code section
if not is_date_complete(date):
return 'invalid'
else:
return parse(date).isoformat()
这里我们利用
\u parse
的结果来确定日期是否缺少年、月或日 Parse接受一个默认参数,它从中接受未指定的部分。因此,最简单的解决方案(除了使用不同的库)是使用两个不同的默认参数调用函数
如果两个调用返回相同的值,则datetime有效,否则会使用一些默认值-您甚至可以通过这种方式找到未指定的值。解析器使用datetime.today()来填充缺少的值。如果将日期传递给parse的
default
参数,parse将使用该日期查找缺少的值。通过为年、月和日传递两个具有不同值的默认日期,我们可以比较解析结果,看看它们是否不同
jan_01_2001 = datetime.datetime.strptime('01/01/01', '%m/%d/%y')
feb_02_2002 = datetime.datetime.strptime('02/02/02', '%m/%d/%y')
complete_date = 'May 4, 2017'
incomplete_date = 'May 4'
print parse(complete_date, default=jan_01_2001) == parse(complete_date, default=feb_02_2002)
# True
print parse(incomplete_date, default=jan_01_2001) == parse(incomplete_date, default=feb_02_2002)
# False
你的问题是什么?给出的代码是正确的。(对于无效或未知的字符串格式,很明显,
parse
会引发ValueError
。“如果日期不完整,即1月1日(缺失年份)或2016年1月(缺失日期),我想立即引发异常。”如果年份或月份等缺失,则插入默认日期。在这些情况下,我想使日期完全无效。@TatianaFrank:如果“1月1日”是给定的日期,你想抛出“失踪年份”之类的异常,还是“1月1日”是给定的日期,你想抛出“无效日期”之类的异常?是的,异常是什么并不重要,只要我有一些指标,我可以用在condition@TatianaFrank我有你的问题。这很难做到,因为parse
具有default
参数,用于填充缺少的日期组件。如果您试图在内部将None
传递给default
(这也是它的默认值),它会将其替换为当前日期,这可以从中看到。我找到了一种解决问题的简单方法,它使用类dateutil.parser.parser
的内部函数\u parse
。我马上会在下面补充这一点。聪明的解决方案:)是的-回答很好。