Cómo calcular la diferencia entre dos fechas en semanas en python

Estoy tratando de calcular la diferencia entre dos fechas en “semanas del año”. Puedo obtener el objeto datetime y obtener los días, etc. pero no los números de la semana. No puedo, por supuesto, restar fechas porque los fines de semana no se pueden asegurar con eso.

Intenté obtener el número de la semana usando d1.isocalendar()[1] y restando d2.isocalendar()[1] pero el problema es que isocalendar()[1] regresa December 31, 2012 como la semana 1 (lo que supuestamente es correcto) pero eso significa que mi lógica no puede extenderse sobre esta fecha.

Para referencia, aquí está mi código completo:

 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 

Con este código, la conferencia del 31 de diciembre de 2012 termina siendo -35.

¿Qué tal si calculamos la diferencia en semanas entre los lunes dentro de semanas de las fechas respectivas? En el siguiente código, monday1 es el lunes en o antes de d1 (la misma semana):

 from datetime import datetime, timedelta monday1 = (d1 - timedelta(days=d1.weekday())) monday2 = (d2 - timedelta(days=d2.weekday())) print 'Weeks:', (monday2 - monday1).days / 7 

Devuelve 0 si ambas fechas caen dentro de una semana, 1 si es en dos semanas consecutivas, etc.

Es posible que desee consultar la Receta 3.3 de Python CookBook (edición de 2005). El siguiente fragmento de código es del libro de cocina, hace lo que necesita.

 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() 

Esta es una solución muy simple con menos encoding que todos entenderían.

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

Para determinar cuántas semanas se extienden en dos fechas. Ej. Del 3 de octubre al 13 de octubre.

  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 

Código:

  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) 

Es igual a 3 semanas.

La solución anterior tiene un error (no puedo agregar un comentario debido a la baja reputación). No tiene en cuenta las diferencias horarias.

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

Ejemplo de contador de 2 fechas con más de una semana de diferencia:

 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 

Usando ese código, devuelve 0 como semana dif. Cuando debería ser 1. También es necesario poner a cero las horas / minutos / segundos.

Eres un poco vago en lo que significa exactamente “diferencia en semanas”. ¿Es la diferencia de 6 días una semana o cero? ¿Es la diferencia de ocho días una semana o dos?

En cualquier caso, ¿por qué no puede simplemente encontrar la diferencia en otra unidad (segundos o días) y dividir por la cantidad apropiada, con su redondeo preferido durante semanas?