如何在Python中解析不完整日期的日期

如何在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来确定是否提供了日期、月份和年份。由于该方法是私有的,其

我正在使用dateutil.parser解析日期,如果日期不完整,即1月1日(缺失年份)或2016年1月1日(缺失日期),我想抛出一个异常。到目前为止,我有以下几点

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
。我马上会在下面补充这一点。聪明的解决方案:)是的-回答很好。