By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
435,627 Members | 1,188 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 435,627 IT Pros & Developers. It's quick & easy.

Creating a list of Mondays for a year

P: n/a
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', ... ]

Sep 18 '05 #1
Share this Question
Share on Google+
9 Replies


P: n/a

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
Sep 18 '05 #2

P: n/a
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
Sep 18 '05 #3

P: n/a
"Chris" <se***@yahoo.com> 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

Sep 18 '05 #4

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

Sep 18 '05 #5

P: n/a
George Sakkis wrote:
"Chris" <se***@yahoo.com> 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
Sep 19 '05 #6

P: n/a
Chris <se***@yahoo.com> 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]
Sep 19 '05 #7

P: n/a
"Peter Hansen" <pe***@engcorp.com> wrote:
George Sakkis wrote:
"Chris" <se***@yahoo.com> 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

Sep 19 '05 #8

P: n/a
Thanks to everyone for your help!

That fit the need perfectly.

In article <MP************************@news2.atlantic.net>,
se***@yahoo.com 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', ... ]

Sep 19 '05 #9

P: n/a
On Mon, 19 Sep 2005 12:10:04 GMT, Chris <se***@yahoo.com> wrote:
Thanks to everyone for your help!

That fit the need perfectly.

In article <MP************************@news2.atlantic.net>,
se***@yahoo.com 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.

Sep 19 '05 #10

This discussion thread is closed

Replies have been disabled for this discussion.