Discussion:
Creating a list of Mondays for a year
(too old to reply)
Chris
2005-09-18 20:08:45 UTC
Permalink
Is there a way to make python create a list of Mondays for a given year?

For example,

mondays = ['1/3/2005','1/10/2005','1/17/2005','1/24/2005',
'1/31/2005','2/7/2005', ... ]
s***@pobox.com
2005-09-18 20:24:56 UTC
Permalink
Chris> Is there a way to make python create a list of Mondays for a
Chris> given year? For example,

Chris> mondays = ['1/3/2005','1/10/2005','1/17/2005','1/24/2005',
Chris> '1/31/2005','2/7/2005', ... ]

How about:

import datetime

oneday = datetime.timedelta(days=1)
oneweek = datetime.timedelta(days=7)

year = 2005

start = datetime.date(year=year, month=1, day=1)
while start.weekday() != 0:
start += oneday

days = []
while start.year == year:
days.append(start)
start += oneweek

print days

Skip
Peter Hansen
2005-09-18 20:52:08 UTC
Permalink
Post by Chris
Is there a way to make python create a list of Mondays for a given year?
For example,
mondays = ['1/3/2005','1/10/2005','1/17/2005','1/24/2005',
'1/31/2005','2/7/2005', ... ]
from datetime import date, timedelta

def mondays(year):
'''generate all days that are Mondays in the given year'''
jan1 = date(year, 1, 1)

# find first Monday (which could be this day)
monday = jan1 + timedelta(days=(7-jan1.weekday()) % 7)

while 1:
if monday.year != year:
break
yield monday
monday += timedelta(days=7)
Post by Chris
[str(x) for x in mondays(2005)]
['2004-01-05', '2004-01-12', ... '2004-12-27']

Extension to support any day of the week (including renaming the
function!) is left as an exercise to the reader. ;-)

--
Peter
George Sakkis
2005-09-18 22:58:33 UTC
Permalink
Post by Chris
Is there a way to make python create a list of Mondays for a given year?
For example,
mondays = ['1/3/2005','1/10/2005','1/17/2005','1/24/2005',
'1/31/2005','2/7/2005', ... ]
Get the dateutil package (https://moin.conectiva.com.br/DateUtil):

import dateutil.rrule as rrule
from datetime import date

mondays2005 = tuple(rrule.rrule(rrule.WEEKLY,
dtstart=date(2005,1,1),
count=52,
byweekday=rrule.MO))

George
Peter Hansen
2005-09-19 00:30:42 UTC
Permalink
Post by George Sakkis
Post by Chris
Is there a way to make python create a list of Mondays for a given year?
import dateutil.rrule as rrule
from datetime import date
mondays2005 = tuple(rrule.rrule(rrule.WEEKLY,
dtstart=date(2005,1,1),
count=52,
byweekday=rrule.MO))
Count should probably be at least "53" to catch the years when there are
that many Mondays.... such as 2001. Unfortunately, I suspect that will
screw it up for other years where there are only 52 (but I don't know
this dateutil package so someone who does would have to say for sure).

-Peter
George Sakkis
2005-09-19 01:39:14 UTC
Permalink
Post by Peter Hansen
Post by George Sakkis
Post by Chris
Is there a way to make python create a list of Mondays for a given year?
import dateutil.rrule as rrule
from datetime import date
mondays2005 = tuple(rrule.rrule(rrule.WEEKLY,
dtstart=date(2005,1,1),
count=52,
byweekday=rrule.MO))
Count should probably be at least "53" to catch the years when there are
that many Mondays.... such as 2001. Unfortunately, I suspect that will
screw it up for other years where there are only 52 (but I don't know
this dateutil package so someone who does would have to say for sure).
-Peter
Sorry, my bad; waldek in the post below got it right. Here's yet
Post by Peter Hansen
Post by George Sakkis
Post by Chris
from itertools import takewhile
mondays2001 = tuple(takewhile(lambda d: d.year==2001,
rrule.rrule(rrule.WEEKLY,
dtstart=date(2001,1,1),
byweekday=rrule.MO)))
Post by Peter Hansen
Post by George Sakkis
Post by Chris
print len(mondays2001)
53

George
w***@gmail.com
2005-09-18 23:27:55 UTC
Permalink
Consider also dateutil written by Gustavo Niemeyer
and found at:
https://moin.conectiva.com.br/DateUtil
from dateutil.rrule import *
list(rrule(WEEKLY, byweekday=MO, dtstart=date(2005,1,1), until=date(2005,12,31)))
The library may be a little intimidating at first it is worth learning.

waldek
Paul Rubin
2005-09-19 00:32:30 UTC
Permalink
Post by Chris
Is there a way to make python create a list of Mondays for a given year?
mondays = ['1/3/2005','1/10/2005','1/17/2005','1/24/2005',
'1/31/2005','2/7/2005', ... ]
This is pretty inefficient but it's conceptually the simplest:

def mondays(year):
from calendar import weekday, monthrange
return [('%d/%d/%d'%(month,day,year))
for month in xrange(1,13)
for day in xrange(1,1+monthrange(year,month)[1])
if weekday(year,month,day) == 0]
Chris
2005-09-19 12:10:04 UTC
Permalink
Thanks to everyone for your help!

That fit the need perfectly.
Post by Chris
Is there a way to make python create a list of Mondays for a given year?
For example,
mondays = ['1/3/2005','1/10/2005','1/17/2005','1/24/2005',
'1/31/2005','2/7/2005', ... ]
Charles Krug
2005-09-19 13:00:18 UTC
Permalink
Post by Chris
Thanks to everyone for your help!
That fit the need perfectly.
Post by Chris
Is there a way to make python create a list of Mondays for a given year?
For example,
mondays = ['1/3/2005','1/10/2005','1/17/2005','1/24/2005',
'1/31/2005','2/7/2005', ... ]
You can also calculate it using the Julian Day Number. Google on
astronomical calculations, or read the introduction to one of the
Numerical Recipies. . . books for a discussion and algorithm.

Continue reading on narkive:
Loading...