Provare a utilizzare datetime.weekday, datetime.isoweekday per ottenere il giorno corrente della settimana o utilizzare il più completo datetime.isocalendar per ottenere anche la settimana in corso dell'anno e con quelli come offset per calcolare una differenza allineata.
così si può avere una funzione come questa:
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 l'utilizzo in questo modo:
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
È possibile aggiungere 1
per l'output settimana a seconda della scelta semantica di ciò che una differenza settimana dovrebbe essere.
È possibile eliminare l'if/else alla fine. Basta restituire la prima dichiarazione: funziona quando gli anni sono uguali a – jterrace
@jterrace ah. L'anno parte da zero se stesso anno. Ho costruito la funzione in modo frammentario e in qualche modo non l'ho notato. Grazie. –