Velocity Reviews > Creating a list of Mondays for a year

# Creating a list of Mondays for a year

Chris
Guest
Posts: n/a

 09-18-2005
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', ... ]

skip@pobox.com
Guest
Posts: n/a

 09-18-2005

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', ... ]

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
Guest
Posts: n/a

 09-18-2005
Chris wrote:
> 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)

>>> [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
Guest
Posts: n/a

 09-18-2005
"Chris" <(E-Mail Removed)> wrote:

> 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

waldemar.osuch@gmail.com
Guest
Posts: n/a

 09-18-2005
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

Peter Hansen
Guest
Posts: n/a

 09-19-2005
George Sakkis wrote:
> "Chris" <(E-Mail Removed)> wrote:
>>Is there a way to make python create a list of Mondays for a given year?

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

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

Paul Rubin
Guest
Posts: n/a

 09-19-2005
Chris <(E-Mail Removed)> writes:
> 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]

George Sakkis
Guest
Posts: n/a

 09-19-2005
"Peter Hansen" <(E-Mail Removed)> wrote:

> George Sakkis wrote:
> > "Chris" <(E-Mail Removed)> wrote:
> >>Is there a way to make python create a list of Mondays for a given year?

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

>
> 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
another way that doesn't use the count or until keywords:

>>> from itertools import takewhile
>>> mondays2001 = tuple(takewhile(lambda d: d.year==2001,

rrule.rrule(rrule.WEEKLY,
dtstart=date(2001,1,1),
byweekday=rrule.MO)))
>>> print len(mondays2001)

53

George

Chris
Guest
Posts: n/a

 09-19-2005
Thanks to everyone for your help!

That fit the need perfectly.

In article <(E-Mail Removed)>,
http://www.velocityreviews.com/forums/(E-Mail Removed) says...
> 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
Guest
Posts: n/a

 09-19-2005
On Mon, 19 Sep 2005 12:10:04 GMT, Chris <(E-Mail Removed)> wrote:
> Thanks to everyone for your help!
>
> That fit the need perfectly.
>
> In article <(E-Mail Removed)>,
> (E-Mail Removed) says...
>> 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.