получение даты начала и окончания каждой недели, предшествующей текущей дате

#python #datetime #calendar

#python #дата и время #Календарь

Вопрос:

Я провел некоторое исследование по этому вопросу и не нашел ничего, что было бы близко к тому, что я хочу. начиная с того, что я довольно новичок в python, поэтому большая часть моего python не очень «pythonic».. помимо этого, я хочу получить дату начала и дату окончания каждой недели, предшествующей текущей дате. в основном я хотел получить рекомендации о том, как это сделать, поскольку существует несколько разных способов сделать это. должен ли я рассмотреть возможность создания его из week number ? или просто с помощью datetime ?

Я надеялся создать его в этом формате

 [{
    'start': 2013-12-30,
    'end': 2014-01-05
},{
    'start': 2014-01-06,
    'end': 2014-01-12
}... etc]
  

Моя первоначальная попытка:

 from datetime import date, timedelta

def get_week_days(self, year, week, **kwd):
    d = date(year,1,1)
    if(d.weekday()>3):
        d = d timedelta(7-d.weekday())
    else:
        d = d - timedelta(d.weekday())
    dlt = timedelta(days = (week-2)*7)
    last_wk = {}
    last_wk['start'] = d   dlt
    last_wk['end'] = d   dlt   timedelta(days=6)
    return last_wk
  

возвращает дату начала и окончания заданной недели по номеру недели. Я мог бы выполнить цикл и вызвать эту функцию, указав количество недель, прошедших в году, но я не уверен, эффективно ли это, или этот метод можно / нужно очистить?

любые рекомендации о том, как я должен это сделать, были бы полезны 🙂 спасибо

Комментарии:

1. Все ваши недели начинаются с января. 1? Также мне любопытно, я знаю, что в Европе принято форматировать даты как дд / мм / гггг, но кто использует гггг-дд-мм? Стандарт ISO — гггг-мм-дд, и это сбивает с толку, если смотреть на это наоборот.

2. неделя, начинающаяся первого января, была просто для примера. формат — это еще одна вещь, которая была примером. это в гггг-мм-дд, я просто написал это задом наперед. я использую гггг-мм-дд, поскольку именно так он изложен в базе данных, с которой мне приходится работать 🙂 я пошел дальше и отредактировал его для вас, чтобы он был в правильном формате и в правильные даты

Ответ №1:

Итак, вызов вашего метода в цикле, безусловно, будет работать. Недостатком этого является то, что вам приходится воссоздавать все заново при каждом вызове метода. Поскольку недели идут последовательно, возможно, было бы лучше найти первую неделю, а затем добавить 1 день, чтобы найти начало следующей недели. Таким образом, вы отталкиваетесь от своей предыдущей работы, и вам не нужно воссоздавать все свои объекты.

Один из способов сделать это — использовать getNextWeek метод.

 def getNextWeek(week):
  nextWeek = {};
  nextWeek['start'] = week['end']   timedelta(days=1)
  nextWeek['end'] = nextWeek['start']   timedelta(days=6)
  return nextWeek
  

Комментарии:

1. Хорошо, это кажется выполнимым 🙂 итак, в методе, который я написал, похоже, есть проблема, потому что, если номер моей недели равен 0, 1 или 2, он возвращается за несколько недель до 30 декабря 2013 года.. знаете ли вы, где моя ошибка?

2. @JohnRuddell Я мало что сделал с date or timedelta , но готов поспорить, что в документации есть объяснение такого поведения.