I know I can use datetime.isocalendar()
for getting the weeknumber given a certain date. How can I do the inverse, given a weeknumber and year retrieve the first day of that week.
Asked
Active
Viewed 793 times
4

SilentGhost
- 307,395
- 66
- 306
- 293

Peter Smit
- 27,696
- 33
- 111
- 170
-
1The question sounds a lot like [this one](http://stackoverflow.com/questions/396913/in-python-how-do-i-find-the-date-of-the-first-monday-of-a-given-week). – Vaidas K. Mar 26 '11 at 21:40
2 Answers
6
If you're limited to stdlib you could do the following:
>>> datetime.datetime.strptime('2011, 4, 0', '%Y, %U, %w')
datetime.datetime(2011, 1, 23, 0, 0)

SilentGhost
- 307,395
- 66
- 306
- 293
-
1Note: this will not use ISO week number, so the start of the year is calculated differently ;) – iElectric Jan 09 '13 at 00:18
-
Agree with @iElectric. This is incorrect. You're using different calendars, so values are not preserved. Try this, and you'll see the date after the conversion changes: `>>> iso_tuple = datetime.date(2003, 12, 29).isocalendar() >>> datetime.datetime.strptime('%d, %d, %d' % iso_tuple, '%Y, %U, %w') datetime.datetime(2004, 1, 5, 0, 0) ` – Waleed Abdulla Jul 07 '13 at 02:53
-
Sorry for the mangled code in the comment. It doesn't accept line breaks. – Waleed Abdulla Jul 07 '13 at 02:59
0
Couldn't find a standard library, so had to roll my own. Main difficulty is finding the first day of the ISO year (which could be in the previous year). You'll need to add some input checks etc...
import datetime
def isoWeekToGregorian(isoYear, isoWeek, isoDayOfWeek):
#we have to find the date of the iso year
t0 = datetime.datetime(isoYear,1,1,0,0,0)
t0iso = t0.isocalendar()
if (t0iso[1] != 1):
t0prime = t0 + datetime.timedelta(7-t0iso[2])
else:
t0prime = t0 - datetime.timedelta(t0iso[2])
#we can add our weeks and days...
return t0prime + datetime.timedelta(7*(isoWeek-1) + isoDayOfWeek)
We can create a simple test:
#TEST: we know 2004 has 53 weeks...
t0 = datetime.datetime(2004,12,26,0,0,0)
t1 = datetime.datetime(2005,1,10,0,0,0)
ndays = (t1-t0).days + 1
for i in range(ndays):
d0 = t0 + datetime.timedelta(i)
d0iso = d0.isocalendar()
if (d0 != isoWeekToGregorian(d0iso[0],d0iso[1],d0iso[2])):
print "failed: %s" % d0
else:
print d0, d0iso
Which correctly prints:
2004-12-26 00:00:00 (2004, 52, 7)
2004-12-27 00:00:00 (2004, 53, 1)
2004-12-28 00:00:00 (2004, 53, 2)
2004-12-29 00:00:00 (2004, 53, 3)
2004-12-30 00:00:00 (2004, 53, 4)
2004-12-31 00:00:00 (2004, 53, 5)
2005-01-01 00:00:00 (2004, 53, 6)
2005-01-02 00:00:00 (2004, 53, 7)
2005-01-03 00:00:00 (2005, 1, 1)
2005-01-04 00:00:00 (2005, 1, 2)
2005-01-05 00:00:00 (2005, 1, 3)
2005-01-06 00:00:00 (2005, 1, 4)
2005-01-07 00:00:00 (2005, 1, 5)
2005-01-08 00:00:00 (2005, 1, 6)
2005-01-09 00:00:00 (2005, 1, 7)
2005-01-10 00:00:00 (2005, 2, 1)

Leon
- 1