nth weekday calculation in Python - whats wrong with this code?

datetime, python

Solution

Your problem is here:

adj = temp.weekday()-week_day

First of all, you are subtracting things the wrong way: you need to subtract the actual day from the desired one, not the other way around.

Second, you need to ensure that the result of the subtraction is not negative - it should be put in the range 0-6 using `% 7`.

The result:

adj = (week_day - temp.weekday()) % 7

In addition, in your second version, you need to add `nth_week-1` weeks like you do in your first version.

Complete example:

def nth_weekday(the_date, nth_week, week_day):
    temp = the_date.replace(day=1)
    adj = (week_day - temp.weekday()) % 7
    temp += timedelta(days=adj)
    temp += timedelta(weeks=nth_week-1)
    return temp

>>> nth_weekday(datetime(2011,8,9), 3, 4)
datetime.datetime(2011, 8, 19, 0, 0)

Problem

I'm trying to calculate the nth weekday for a given date. For example, I should be able to calculate the 3rd wednesday in the month for a given date. I have written 2 versions of a function that is supposed to do that: ``` from datetime import datetime, timedelta ### version 1 def nth_weekday(the_date, nth_week, week_day): temp = the_date.replace(day=1) adj = (nth_week-1)*7 + temp.weekday()-week_day return temp + timedelta(days=adj) ### version 2 def nth_weekday(the_date, nth_week, week_day): temp = the_date.replace(day=1) adj = temp.weekday()-week_day temp += timedelta(days=adj) temp += timedelta(weeks=nth_week) return temp ``` Console output ``` # Calculate the 3rd Friday for the date 2011-08-09 x=nth_weekday(datetime(year=2011,month=8,day=9),3,4) print 'output:',x.strftime('%d%b%y') # output: 11Aug11 (Expected: '19Aug11') ``` The logic in both functions is obviously wrong, but I can't seem to locate the bug - can anyone spot what is wrong with the code - and how do I fix it to return the correct value?

Original source