Creating a list of Mondays for a year

C

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

skip

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
 
P

Peter Hansen

Chris said:
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. ;-)
 
G

George Sakkis

Chris said:
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
 
P

Peter Hansen

George said:
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
 
P

Paul Rubin

Chris said:
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]
 
G

George Sakkis

Peter Hansen said:
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:
rrule.rrule(rrule.WEEKLY,
dtstart=date(2001,1,1),
byweekday=rrule.MO)))53

George
 
C

Charles Krug

Thanks to everyone for your help!

That fit the need perfectly.

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,767
Messages
2,569,570
Members
45,045
Latest member
DRCM

Latest Threads

Top