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

时间:2016-09-23 05:14:47

标签: python

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

try: 
    parse(date)
    return parse(date).isoformat()
except ValueError:
    return 'invalid'

3 个答案:

答案 0 :(得分:2)

您可以使用类_parse的私有方法dateutil.parser.parser来确定是否已提供日,月和年。由于该方法是私有的,其行为可能会改变,并且通常不建议在生产代码中使用其他类的私有方法,但在这种特殊情况下使用它是最简单和最健壮的方法,因此它可能没问题。

修改后的代码如下:

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()

这里我们使用_parse的结果来确定日期是否缺少年,月或日。

答案 1 :(得分:2)

Parse采用默认参数,从中获取未指定的部分。因此,最简单的解决方案(除了使用不同的库)将使用两个不同的默认参数调用该函数。

如果两个调用返回相同的值,则datetime有效,否则使用一些默认值 - 您甚至可以通过这种方式找出未指定的内容。

答案 2 :(得分:0)

解析器使用datetime.today()来填充缺失值。如果您将日期传递给解析的default参数,则解析将使用该日期作为缺失值。通过传递两个具有不同年份,月份和日期值的默认日期,我们可以比较解析结果并查看它们是否不同。

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