Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get the last thursday of the current month using python

Following this answer I tried to get the date for last Thursday of the current month. But my code doesn't get out of loop.

from datetime import datetime
from dateutil.relativedelta import relativedelta, TH

todayte = datetime.today()
cmon = todayte.month

nthu = todayte
while nthu.month == cmon:
    nthu += relativedelta(weekday=TH(1))
    #print nthu.strftime('%d%b%Y').upper()
like image 990
Frash Avatar asked Dec 25 '22 06:12

Frash


2 Answers

Looking at the documentation of relativedelta

Notice that if the calculated date is already Monday, for example, using (0, 1) or (0, -1) won’t change the day.

If nthu is already Thursday then adding TH(1) or TH(-1) won't have any effect but result in the same date and that's why your loop is running infinitely.

I will assume maximum 5 weeks in a month and do it like following:

todayte = datetime.today()
cmon = todayte.month

for i in range(1, 6):
    t = todayte + relativedelta(weekday=TH(i))
    if t.month != cmon:
        # since t is exceeded we need last one  which we can get by subtracting -2 since it is already a Thursday.
        t = t + relativedelta(weekday=TH(-2))
        break
like image 178
AKS Avatar answered Dec 26 '22 19:12

AKS


Based on Adam Smith's answer on How can I get the 3rd Friday of a month in Python?, you can get the date of the last Thursday of the current month as follows:

import calendar
import datetime

def get_thursday(cal,year,month,thursday_number):
    '''
    For example, get_thursday(cal, 2017,8,0) returns (2017,8,3) 
    because the first thursday of August 2017 is 2017-08-03
    '''
    monthcal = cal.monthdatescalendar(year, month)
    selected_thursday = [day for week in monthcal for day in week if \
                    day.weekday() == calendar.THURSDAY and \
                    day.month == month][thursday_number]
    return selected_thursday

def main():
    '''
    Show the use of get_thursday()
    '''
    cal = calendar.Calendar(firstweekday=calendar.MONDAY)
    today = datetime.datetime.today()
    year = today.year
    month = today.month
    date = get_thursday(cal,year,month,-1) # -1 because we want the last Thursday 
    print('date: {0}'.format(date)) # date: 2017-08-31        

if __name__ == "__main__":
    main()
like image 36
Franck Dernoncourt Avatar answered Dec 26 '22 19:12

Franck Dernoncourt