没有指定年份的 Python 智能日期解析

标签 python python-dateutil

我如何解析没有年份的日期(使用 dateutil),以便当当前日期为 17/11/2012 时,这些日期将像这样解析:

print parser.parse("23 nov", dayfirst=True, yearfirst=False, fuzzy=True)
# 23/11/2012
print parser.parse("28 dec", dayfirst=True, yearfirst=False, fuzzy=True)
# 28/12/2012
print parser.parse("3 jan", dayfirst=True, yearfirst=False, fuzzy=True)
# 3/01/2013

我想要的是已经过去的月份将在当年之后的一年中。有什么简单的解决方案吗?

最佳答案

自动查找 future 日期:

from dateutil import parser
from dateutil.relativedelta import relativedelta

def parse_future(timestr, default, **parse_kwargs):
    """Same as dateutil.parser.parse() but only returns future dates."""
    now = default
    for _ in range(401):  # assume gregorian calendar repeats every 400 year
        try:
            dt = parser.parse(timestr, default=default, **parse_kwargs)
        except ValueError:
            pass
        else:
            if dt > now: # found future date
                break
        default += relativedelta(years=+1)
    else: # future date not found
        raise ValueError('failed to find future date for %r' % (timestr,))
    return dt

例子

from datetime import datetime

for timestr in ["23 nov", "28 dec", "3 jan", "29 feb"]:
    print parse_future(timestr, default=datetime(2012, 11, 17)).date()

输出

2012-11-23
2012-12-28
2013-01-03
2016-02-29

注意:“29 feb”翻译为“2016-02-29”。

关于没有指定年份的 Python 智能日期解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13429524/

相关文章:

python - Ansible 过滤器 stdout_lines 剪切或分割

python - Scipy:稀疏矩阵的维数错误?

Python 提前数天/数周/数月

python - 月份范围计算未返回预期结果

python - 将长字符串解析为日期时间

python - 如何将多个 py 文件编译为一个文件?

javascript - 使用 Python 中的请求从 __doPostBack 下载文本文件

python - 以完整的方式重组数据框

python - 如何解析这个时间格式?

python - 如何从特定日期格式中减去月份?