How to get last Friday?

The code below should be back last Friday at 4:00 p.m. But he returns Friday of the previous week . How to fix it?

now = datetime.datetime.now() test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4, weeks=-1)) test = test.replace(hour=16,minute=0,second=0,microsecond=0) 

Upd. Now I use the following approach: is it the best?

 now = datetime.datetime.now() if datetime.datetime.now().weekday() > 4: test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4)) else: test = (now - datetime.timedelta(days=now.weekday()) + timedelta(days=4, weeks=-1)) test = test.replace(hour=16,minute=0,second=0,microsecond=0) 

UPD2. Just to give an example. Suppose today is October 5, 2012. If the current time is equal to or less than 16:00, it must be returned on September 28, 2012, otherwise - on October 5, 2012.

+6
source share
6 answers

As in the related question, you need to use datetime.date objects instead of datetime.datetime . To get datetime.datetime at the end, you can use datetime.datetime.combine() :

 import datetime current_time = datetime.datetime.now() # get friday, one week ago, at 16 o'clock last_friday = (current_time.date() - datetime.timedelta(days=current_time.weekday()) + datetime.timedelta(days=4, weeks=-1)) last_friday_at_16 = datetime.datetime.combine(last_friday, datetime.time(16)) # if today is also friday, and after 16 o'clock, change to the current date one_week = datetime.timedelta(weeks=1) if current_time - last_friday_at_16 >= one_week: last_friday_at_16 += one_week 
+4
source

dateutil library is great for things like this:

 >>> from datetime import datetime >>> from dateutil.relativedelta import relativedelta, FR >>> datetime.now() + relativedelta(weekday=FR(-1)) datetime.datetime(2012, 9, 28, 9, 42, 48, 156867) 
+12
source

The principle is the same as in your other question .

Get the Friday of the current week and, if we later, subtract one week.

 import datetime from datetime import timedelta now = datetime.datetime.now() today = now.replace(hour=16,minute=0,second=0,microsecond=0) sow = (today - datetime.timedelta(days=now.weekday())) this_friday = sow + timedelta(days=4) if now > this_friday: test = this_friday else: test = this_friday + timedelta(weeks=-1) 
+1
source

This was borrowed from John Clement, but this is the complete solution:

 >>> from datetime import datetime >>> from dateutil.relativedelta import relativedelta, FR >>> lastFriday = datetime.now() + relativedelta(weekday=FR(-1)) >>> lastFriday.replace(hour=16,minute=0,second=0,microsecond=0) datetime.datetime(2012, 9, 28, 16, 0, 0, 0) 
0
source

It may be lame, but for me the easiest. Get the last day of the current month and start checking in a cycle (which will not cost anything, since the maximum cycles before last Friday is 7) on Friday. if the last day is not a Friday decree and check the day before.

 import calendar from datetime import datetime, date def main(): year = datetime.today().year month = datetime.today().month x = calendar.monthrange(year,month) lastday = x[1] while True: z = calendar.weekday(year, month, lastday) if z != 4: lastday -= 1 else: print(date(year,month,lastday)) break if __name__ == "__main__": main() 
0
source

The simplest solution without dependency:

 from datetime import datetime, timedelta def get_last_friday(): now = datetime.now() closest_friday = now + timedelta(days=(4 - now.weekday())) return (closest_friday if closest_friday < now else closest_friday - timedelta(days=7)) 
0
source

Source: https://habr.com/ru/post/926731/


All Articles