5

現在の日付が 17/11/2012 のときにこれらの日付が次のように解析されるように、年なしで (dateutil を使用して) 日付を解析するにはどうすればよいですか。

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

私が欲しいのは、すでに過ぎた月が現在の年の次の年になることです。これに対する簡単な解決策はありますか?

4

2 に答える 2

4

将来の日付を自動的に検索するには:

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

注: 「2 月 29 日」は「2016 年 2 月 29 日」に変換されます。

于 2012-11-17T11:19:47.760 に答える
0

この関数は、渡された月の指定された日付に 1 年を加算します。

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ように処理されます。

>>> 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)
于 2012-11-17T10:27:59.347 に答える