首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未指定年份的Python智能日期解析

未指定年份的Python智能日期解析
EN

Stack Overflow用户
提问于 2012-11-17 18:04:03
回答 2查看 2.2K关注 0票数 5

如何在没有年份的情况下解析日期(使用dateutil),以便当当前日期为2012年17月11日时,这些日期将按如下方式解析:

代码语言:javascript
复制
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

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

EN

回答 2

Stack Overflow用户

发布于 2012-11-17 19:19:48

要自动查找未来日期,请执行以下操作:

代码语言:javascript
复制
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

示例

代码语言:javascript
复制
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()

输出

代码语言:javascript
复制
2012-11-23
2012-12-28
2013-01-03
2016-02-29

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

票数 4
EN

Stack Overflow用户

发布于 2012-11-17 18:27:59

此函数将为过去月份的提供日期添加一年:

代码语言:javascript
复制
from datetime import date
from dateutil.relativedelta import relativedelta

def add_one_year_to_passed_months(date):
    today = date.today()
    if date.month < today.month:
        return date + relativedelta(years=1)
    return date

像2012这样的闰年是由relativedelta以这种方式处理的:

代码语言:javascript
复制
>>> add_one_year_to_passed_months(date(2012, 2, 28))
datetime.date(2013, 2, 28)

>>> add_one_year_to_passed_months(date(2012, 2, 29))
datetime.date(2013, 2, 28)

>>> add_one_year_to_passed_months(date(2012, 3, 1))
datetime.date(2013, 3, 1)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13429524

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档