Получите понедельник и воскресенье и прошлогодний понедельник и воскресенье на той же неделе - PullRequest
4 голосов
/ 27 января 2012

Учитывая datetime.datetime.now (), как мне получить понедельник - воскресенье этой недели, а затем тот же понедельник - воскресенье за ​​прошлый год, учитывая високосные годы?Timedelta на -365 дней, а затем найти ближайший понедельник или воскресенье.Я уверен, что есть лучший способ.

Редактировать: Я не против использовать datetuil, если есть что-то, что могло бы сделать это проще.

Ответы [ 4 ]

8 голосов
/ 27 января 2012

Если использование dateutil не является проблемой, просто используйте его:)

lativedelta - это нужный вам объект. Здесь вы сможете вычесть один год до текущей даты.

from datetime import *
from dateutil.relativedelta import *
NOW = datetime.now()
last_monday = NOW+relativedelta(years=-1, weekday=MO)
last_sunday = NOW+relativedelta(years=-1, weekday=SU)
3 голосов
/ 27 января 2012

Если в этом году этот понедельник имеет дату N, в тот же понедельник прошлого года будет дата N + 1, если между ними не было 29 февраля, иначе в понедельник прошлого года будет дата N + 2.

from datetime import date, timedelta

today = date.today()
monday = today - timedelta(today.weekday())
sunday = monday + timedelta(6);
print monday, '-', sunday

monday_last_year = monday - timedelta(364) # We are trying to go to date N + 1.
if monday_last_year.weekday() == 1: # It will be either 0 or 1.
    monday_last_year + timedelta(1) # This is date N + 2.
sunday_last_year = monday_last_year + timedelta(6)
print monday_last_year, '-', sunday_last_year
2 голосов
/ 27 января 2012
from datetime import date, timedelta
monday = date.today() - timedelta(days=date.today().weekday())
sunday = monday + timedelta(days=6)

Ответ на второй вопрос может зависеть от того, что считается «тем же» понедельником-воскресеньем. Я бы начал с наивной версии и поправил бы, если это не правильно:

last_year_mon = monday - timedelta(weeks=52)
last_year_sun = last_year_mon + timedelta(days=6)
0 голосов
/ 27 января 2012

Вы можете использовать .isocalendar(), чтобы получить номер недели в году, а затем получить понедельник / воскресенье этой недели для текущего и предыдущего года.

year, week, _ = datetime.datetime.now().isocalendar()

Затем, используя iso_to_gregorian из этого ответа :

this_sunday = iso_to_gregorian(year, week, 0)
this_monday = iso_to_gregorian(year, week, 1)
last_year_sunday = iso_to_gregorian(year - 1, week, 0)
last_year_monday = iso_to_gregorian(year - 1, week, 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...