I've been trying to come up with a good algorithm for determining
the starting and ending dates given the week number (as defined
by the strftime("%W") function).
My preference would be for a Sunday->Saturday range rather than a
Monday->Sunday range. Thus,
[color=blue][color=green][color=darkred]
>>> startDate, stopDate = weekBoundaries( 2006, 23)[/color][/color][/color]
would yield a start-date of June 4, 2006 and an end-date of June
10, 2006 in this hypothetical function (as strftime("%W") for
today, June 9th, 2006 returns 23).
I've posted my first round of code below, but I'm having problems
with dates early in 2005, as the tests show.
Any thoughts/improvements/suggestions would be most welcome.
Thanks,
-tkc
from datetime import date, timedelta
from time import strptime
DEBUG = False
tests = [
#test date start end
(date(2006,1,1) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,2) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,3) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,4) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,5) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,6) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,7) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,8) , (date(2006,1,8) , date(2006,1,14) )),
(date(2005,1,1) , (date(2004,12,2 6), date(2005,1,1)) ),
(date(2005,1,2) , (date(2005,1,2) , date(2005,1,8)) ),
]
def weekBoundaries( year, week):
startOfYear = date(year, 1, 1)
now = startOfYear + timedelta(weeks =week)
# isoweekday() % 7 returns Sun=0 ... Sat=6
sun = now - timedelta(days= now.isoweekday( ) % 7)
sat = sun + timedelta(days= 6)
if DEBUG:
print "DEBUG: now = %s/%s" % (now, now.strftime("% a"))
print "DEBUG: sun = %s/%s" % (sun, sun.strftime("% a"))
print "DEBUG: sat = %s/%s" % (sat, sat.strftime("% a"))
return sun, sat
for test, expectedResult in tests:
print "Testing %s" % test
year = test.year
# jigger it so that %W is Sun->Sat rather than Mon->Sun
weekNum = int((test + timedelta(days= 1)).strftime("% W")) - 1
results = weekBoundaries( year, weekNum)
passed = (expectedResult == results)
print "Week#%s: %s" % (weekNum, passed)
print "=" * 50
the starting and ending dates given the week number (as defined
by the strftime("%W") function).
My preference would be for a Sunday->Saturday range rather than a
Monday->Sunday range. Thus,
[color=blue][color=green][color=darkred]
>>> startDate, stopDate = weekBoundaries( 2006, 23)[/color][/color][/color]
would yield a start-date of June 4, 2006 and an end-date of June
10, 2006 in this hypothetical function (as strftime("%W") for
today, June 9th, 2006 returns 23).
I've posted my first round of code below, but I'm having problems
with dates early in 2005, as the tests show.
Any thoughts/improvements/suggestions would be most welcome.
Thanks,
-tkc
from datetime import date, timedelta
from time import strptime
DEBUG = False
tests = [
#test date start end
(date(2006,1,1) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,2) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,3) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,4) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,5) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,6) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,7) , (date(2006,1,1) , date(2006,1,7)) ),
(date(2006,1,8) , (date(2006,1,8) , date(2006,1,14) )),
(date(2005,1,1) , (date(2004,12,2 6), date(2005,1,1)) ),
(date(2005,1,2) , (date(2005,1,2) , date(2005,1,8)) ),
]
def weekBoundaries( year, week):
startOfYear = date(year, 1, 1)
now = startOfYear + timedelta(weeks =week)
# isoweekday() % 7 returns Sun=0 ... Sat=6
sun = now - timedelta(days= now.isoweekday( ) % 7)
sat = sun + timedelta(days= 6)
if DEBUG:
print "DEBUG: now = %s/%s" % (now, now.strftime("% a"))
print "DEBUG: sun = %s/%s" % (sun, sun.strftime("% a"))
print "DEBUG: sat = %s/%s" % (sat, sat.strftime("% a"))
return sun, sat
for test, expectedResult in tests:
print "Testing %s" % test
year = test.year
# jigger it so that %W is Sun->Sat rather than Mon->Sun
weekNum = int((test + timedelta(days= 1)).strftime("% W")) - 1
results = weekBoundaries( year, weekNum)
passed = (expectedResult == results)
print "Week#%s: %s" % (weekNum, passed)
print "=" * 50
Comment