Given a day, I want to get all days(datetime instances) of the week in which day is present.
I have a solution, please correct me if there is something wrong of if more efficient method exists.
>>> import datetime
>>> today = datetime.datetime(2013, 06, 26)
>>> today
datetime.datetime(2013, 6, 26, 0, 0)
>>> day_of_week = today.isocalendar()[2] - 1
>>> day_of_week
2
>>> start_date = today - timedelta(days=day_of_week)
>>> start_date
datetime.datetime(2013, 6, 24, 0, 0) # Got monday
>>> dates = [start + timedelta(days=i) for i in range(7)]
>>> dates
[datetime.datetime(2013, 6, 24, 0, 0),
datetime.datetime(2013, 6, 25, 0, 0),
datetime.datetime(2013, 6, 26, 0, 0),
datetime.datetime(2013, 6, 27, 0, 0),
datetime.datetime(2013, 6, 28, 0, 0),
datetime.datetime(2013, 6, 29, 0, 0),
datetime.datetime(2013, 6, 30, 0, 0)]
I want monday to be start date and sunday the end date.
I'd use datetime.date()
instead to make it clear we are calculating dates here, and use date.weekday()
to get the current weekday instead of using the .isocalendar()
call, giving us a 0-based weekday number (0 is Monday).
import datetime
today = datetime.date(2013, 06, 26)
dates = [today + datetime.timedelta(days=i) for i in range(0 - today.weekday(), 7 - today.weekday())]
Demo:
>>> from pprint import pprint
>>> import datetime
>>> today = datetime.date(2013, 06, 26)
>>> pprint([today + datetime.timedelta(days=i) for i in range(0 - today.weekday(), 7 - today.weekday())])
[datetime.date(2013, 6, 24),
datetime.date(2013, 6, 25),
datetime.date(2013, 6, 26),
datetime.date(2013, 6, 27),
datetime.date(2013, 6, 28),
datetime.date(2013, 6, 29),
datetime.date(2013, 6, 30)]
On python 2 you can replace range()
with xrange()
if you like; for a 7-day value that won't make much difference.
Just to make it explicit; datetime.weekday()
exists as well, and there is a .isoweekday()
too, so there is no need to use .isocalendar()
anywhere.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With