What’s the best way to find the inverse of datetime.isocalendar()?
I have an ISO 8601 year and week number, and I need to translate this to the date of the first day in that week (Monday). How can I do this?
datetime.strptime() takes both a
%W and a
%U directive, but neither adheres to the ISO 8601 weekday rules that datetime.isocalendar() use.
Update: Python 3.6 supports the
%u directives also present in libc, allowing this one-liner:
'2011 22 1', '%G %V %u') datetime.datetime(2011, 5, 30, 0, 0)datetime.strptime(
Update 2: Python 3.8 added the
fromisocalendar() method, which is even more intuitive:
2011, 22, 1) datetime.datetime(2011, 5, 30, 0, 0)datetime.fromisocalendar(
%W takes the first Monday to be in week 1 but ISO defines week 1 to contain 4 January. So the result from
is off by one iff the first Monday and 4 January are in different weeks.
The latter is the case if 4 January is a Friday, Saturday or Sunday.
So the following should work:
from datetime import datetime, timedelta, date def tofirstdayinisoweek(year, week): ret = datetime.strptime('%04d-%02d-1' % (year, week), '%Y-%W-%w') if date(year, 1, 4).isoweekday() > 4: ret -= timedelta(days=7) return ret
With the isoweek module you can do it with:
from isoweek import Week d = Week(2011, 40).monday()