Python Smart parsing dates without a specified year

How can I parse dates (with dateutil) without a year, so that when the current date is 11/17/2012, these dates will be parsed as follows:

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 

I want the past months to be in the year following the current year. Is there an easy solution for this?

+4
source share
2 answers

To automatically find future dates:

 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 

Example

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

Output

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

Note: "29 feb" has been translated to "2016-02-29".

+4
source

This function adds one year to the delivery date over the past months:

 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 

Leaf years, such as 2012, are respected relativedelta as follows:

 >>> 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
source

Source: https://habr.com/ru/post/1446620/


All Articles