Trate de usar datetime.weekday, datetime.isoweekday para obtener el día actual de la semana o utilizar la más completa datetime.isocalendar para obtener también la semana en curso del año y uso de los mismos como compensaciones para calcular una diferencia alineados.
para que pueda tener una función como esta:
def week_difference(start, end):
assert start <= end
start_year, start_week, start_dayofweek = start.isocalendar()
end_year, end_week, end_dayofweek = end.isocalendar()
return ((end_year - start_year) * 52) - start_week + end_week
Con el uso de la siguiente manera:
import datetime as dt
# same week
In [1]: week_difference(dt.datetime(2012, 8, 1), dt.datetime(2012, 8, 1))
Out[1]: 0
# your example (see note below)
In [2]: week_difference(dt.datetime(2012, 8, 1), dt.datetime(2012, 8, 13))
Out[2]: 2
# across years
In [3]: week_difference(dt.datetime(2011, 8, 1), dt.datetime(2012, 8, 13))
Out[3]: 54
# year boundary: second last business week of 2011, to first business week of 2012
# which is the same business week as the last business week of 2011
In [4]: week_difference(dt.datetime(2011, 12, 20), dt.datetime(2012, 1, 1))
Out[4]: 1
In [5]: week_difference(dt.datetime(2011, 12, 18), dt.datetime(2012, 1, 1))
Out[5]: 2
Puede añadir 1
a su salida de la semana dependiendo de su elegido semántico de lo que una diferencia de semana debiera ser.
Puede deshacerse del if/else al final. Simplemente devuelva la primera declaración: funciona cuando los años son los mismos – jterrace
@jterrace ah, por supuesto. La parte del año se cierra si es el mismo año. Construí la función por partes y de alguna manera no me di cuenta. Gracias. –