2016-05-02 3 views
3

Suite à cette answer j'ai essayé d'obtenir la date pour le dernier jeudi du mois en cours. Mais mon code ne sort pas de la boucle.Obtenir le dernier jeudi du mois en cours en utilisant python

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

Répondre

2

regardant la documentation de relativedelta

Notez que si la date calculée est déjà Monday, par exemple, en utilisant (0, 1) ou (0, -1) ne changera pas le jour.

Si nthu est déjà jeudi puis en ajoutant TH(1) ou TH(-1) n'aura aucun effet, mais donner lieu à la même date et voilà pourquoi votre boucle est en cours d'exécution à l'infini.

Je suppose un maximum de 5 semaines dans un mois et de le faire comme suit:

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 
1

Vous devriez passer 2-TH au lieu de 1, comme 1 ne change rien. Modifier votre code:

while (nthu + relativedelta(weekday=TH(2))).month == cmon: 
    nthu += relativedelta(weekday=TH(2)) 

print nthu.strftime('%d-%b-%Y').upper() 
# prints 26-MAY-2016 

Notez que j'ai modifié l'état de la boucle afin de briser la dernière occurrence du jour du mois, sinon il va briser le mois suivant (dans ce cas, Juin) .

+1

Cela échouera si la valeur initiale de 'nthu' est' 23-MAI-2016'. ou n'importe quel jour de la même semaine de jeudi dernier. – AKS

1
from datetime import datetime , timedelta 

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

nthu = todayte 
while todayte.month == cmon: 
    todayte += timedelta(days=1) 
    if todayte.weekday()==3: #this is Thursday 
     nthu = todayte 
print nthu 
1

Vous pouvez également utiliser package calendar. Accédez au calendrier sous la forme monthcalendar. et remarquez que le vendredi est le dernier jour d'une semaine.

import calendar 
import datetime 
now = datetime.datetime.now() 
last_sunday = max(week[-1] for week in calendar.monthcalendar(now.year, 
                   now.month)) 
print('{}-{}-{:2}'.format(now.year, calendar.month_abbr[now.month], 
           last_sunday)) 
0

Je pense que ce sera le plus rapide peut-être:

end_of_month = datetime.datetime.today() + relativedelta(day=31) 
last_thursday = end_of_month + relativedelta(weekday=TH(-1)) 
0

Basé sur Adam la réponse de Smith sur How can I get the 3rd Friday of a month in Python?, vous pouvez obtenir la date du dernier jeudi du mois en cours comme suit:

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