Как рассчитать разницу между двумя датами в неделях в python

Я пытаюсь рассчитать разницу между двумя датами в "недели года". Я могу получить объект datetime и получить дни и т.д., Но не число недель. Я не могу, конечно, вычитать даты, потому что выходные не могут быть обеспечены этим.

Я попытался получить номер недели, используя d1.isocalendar()[1] и вычитая d2.isocalendar()[1], но проблема в том, что isocalendar()[1] возвращает December 31, 2012 как неделю 1 (что, предположительно, правильно), но это означает, что моя логика не может охватывать эту дату.

Для справки, здесь мой полный код:

def week_no(self):
    ents = self.course.courselogentry_set.all().order_by('lecture_date')
    l_no = 1
    for e in ents:
        if l_no == 1: 
             starting_week_of_year = e.lecture_date.isocalendar()[1] # get week of year
             initial_year = e.lecture_date.year   
        if e == self: 
            this_year = e.lecture_date.year
            offset_week = (this_year - initial_year) * 52
            w_no = e.lecture_date.isocalendar()[1] - starting_week_of_year + 1 + offset_week
            break 
        l_no += 1
    return w_no  

С помощью этого кода лекция 31 декабря 2012 года заканчивается на -35.

Ответы

Ответ 1

Как рассчитать разницу в неделях между понедельниками в течение недель соответствующих дат? В следующем коде monday1 находится в понедельник или до d1 (на той же неделе):

from datetime import datetime, timedelta

monday1 = (d1 - timedelta(days=d1.weekday()))
monday2 = (d2 - timedelta(days=d2.weekday()))

print 'Weeks:', (monday2 - monday1).days / 7

Возвращает 0, если обе даты падают с одной недели, 1, если две недели подряд и т.д.

Ответ 2

Вы можете захотеть сослаться на Python CookBook (выпуск 2005 года). Рецепт 3.3. Следующий фрагмент кода из кулинарной книги, делает то, что вам нужно.

from dateutil import rrule
import datetime
def weeks_between(start_date, end_date):
    weeks = rrule.rrule(rrule.WEEKLY, dtstart=start_date, until=end_date)
    return weeks.count()

Ответ 3

Чтобы определить, сколько недель занимает две даты. например, с 3 октября по 13 октября

    October 2015
Mo     5 12 19 26
Tu     6 13 20 27
We     7 14 21 28
Th  1  8 15 22 29
Fr  2  9 16 23 30
Sa  3 10 17 24 31
Su  4 11 18 25

код:

    import math, datetime

    start_date = datetime.date(2015, 10, 3)
    start_date_monday = (start_date - datetime.timedelta(days=start_date.weekday()))
    end_date = datetime.date(2015, 10, 13)
    num_of_weeks = math.ceil((end_date - start_date_monday).days / 7.0)

Равно 3 недели.

Ответ 4

Вы немного расплывчаты в том, что означает "разница в неделях". Разница в 6 дней одна неделя или ноль? Разница в восемь дней одна-две недели?

В любом случае, почему вы не можете просто найти разницу в другой единице (секунды или дни) и разделить на соответствующую сумму, с предпочтительным округлением в течение нескольких недель?

Ответ 5

В приведенном выше решении есть ошибка (я не могу добавить комментарий из-за низкой репутации). Это не учитывает часовые различия.

# This code has a bug.
monday1 = (d1 - timedelta(days=d1.weekday()))
monday2 = (d2 - timedelta(days=d2.weekday()))

Встречный пример из 2 дат более недели:

Timestamp1: 1490208193270795 (22 Mar 2017 18:43:13 GMT)
Monday1: 20 Mar 2017 18:43:13 GMT

Timestamp2: 1489528488744290 (14 Mar 2017 21:54:48 GMT)
Monday2: 13 Mar 2017 21:54:48 GMT

Используя этот код, он возвращает 0 как недельный diff, когда он должен быть 1. Нужно также обнулить часы/минуты/секунды.

Ответ 6

Это очень простое решение с меньшим количеством кодирования, которое все поймут.

from datetime import date

d1 = date(year, month, day)
d2 = date(year, month, day)
result = (d1-d2).days//7