23

Eg1. Suppose I have a day 4/30/07 .Then I need to get 4/27/07.

Eg2. Suppose I have a day 6/29/07 .Then I need to get 6/22/07.

ThiefMaster
  • 310,957
  • 84
  • 592
  • 636
Jibin
  • 3,054
  • 7
  • 36
  • 51
  • 4
    not necessarily. actually i just wrote very similar code (get the monday of the week indicated by a random date withing that week) less than a day ago for a timetable for one of my websites. – ThiefMaster May 30 '11 at 06:11

5 Answers5

49

Assuming day is a datetime.date or datetime.datetime object, this code creates a datetime/date object for last week's friday:

friday = day - timedelta(days=day.weekday()) + timedelta(days=4, weeks=-1)

Explanation: timedelta(days=day.weekday()) is the offset between monday and day so adding 4 days and subtracting one week will get you last week's friday.

Of course you can simplify this (+4d -1w = -3d):

friday = day - timedelta(days=day.weekday() + 3)

Note: To get timedelta, use from datetime import timedelta or just import datetime and use datetime.timedelta

ThiefMaster
  • 310,957
  • 84
  • 592
  • 636
  • 7
    That doesn't work on Saturday and Sunday. Try this: `friday = day - timedelta(days=(day.weekday() - 4) % 7, weeks=-1)` – Dennis Williamson Sep 03 '12 at 21:50
  • 1
    With which date did you have this problem? I tested with 2012-09-08 and 2012-09-09 and my code correctly gave me 2012-08-31 while yours resulted in 2012-09-14 – ThiefMaster Sep 04 '12 at 01:14
  • 2
    My code should be `weeks=0` (or omit the argument). I miss-posted. Also, the desired result depends on what you mean by "previous/last week" and whether you define a week starting on Sunday or Monday. I may have misinterpreted the question. My (corrected) code gives the most recent Friday. – Dennis Williamson Sep 04 '12 at 17:11
  • 1
    Ah well, for me a week starts on monday... Feel free to post another answer mentioning that yours assumes weeks start on sunday. – ThiefMaster Sep 04 '12 at 22:23
34

An another and easier way is to use python-dateutil. To get the previous Friday :

>>> from dateutil.relativedelta import relativedelta, FR
>>> from datetime import datetime
>>> datetime(2015, 7, 8) + relativedelta(weekday=FR(-1))
datetime.datetime(2015, 7, 3, 0, 0)

And the next Friday :

>>> datetime(2015, 7, 8) + relativedelta(weekday=FR(+1))
datetime.datetime(2015, 7, 10, 0, 0)
ychab
  • 341
  • 3
  • 3
4

Not specific to Friday, but given a day "taget_dayofweek" (where Monday is 0 and Sunday is 6)

from datetime import datetime

target_dayofweek = 4  # Friday
current_dayofweek = datetime.now().weekday() # Today


if target_dayofweek <= current_dayofweek:
    # target is in the current week
    endDate = datetime.now() - timedelta(current_dayofweek - target_dayofweek)

else: 
    # target is in the previous week
    endDate = datetime.now() - timedelta(weeks=1) + timedelta(target_dayofweek - current_dayofweek)
mumu
  • 41
  • 2
1

There are plenty of options in pandas.tseries.offsets This one is for previous week friday.

from pandas.tseries.offsets import Week
f_dates = required_df.index - Week(1, weekday=4)
lxkarthi
  • 336
  • 4
  • 14
0
date_object = datetime.date.today()
from dateutil.relativedelta import relativedelta
previousWeekLastDay = date_object + relativedelta(weekday=SU(-1))
previousWeekFirstDay = previousWeekLastDay + relativedelta(weekday=MO(-1))
print(previousWeekFirstDay)
print(previousWeekLastDay)

previoustopreviousWeekLastDay1= date_object + relativedelta(weekday=SU(-2))
previoustopreviousWeekFirstDay1= previousWeekLastDay1 + relativedelta(weekday=MO(-1))
print(previoustopreviousWeekFirstDay1)
print(previoustopreviousWeekLastDay1)