2012-08-14 8 views
5

Data una data di inizio, come posso determinare quante "business week" è stato con Python? Non posso dividere per 7 perché non mi darà la risposta corretta.settimane di conteggio python

Un esempio potrebbe essere una data di inizio del 1 ° agosto 2012 alla data corrente (13 agosto 2012) in uscita 3 settimane.

Fondamentalmente sto cercando di capire dall'inizio della stagione calcistica, qual è la settimana corrente (numero intero).

Ho provato a fare i conti con il modulo datetime Pythons, ma è stato inutilmente.

risposta

7

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.

+0

È possibile eliminare l'if/else alla fine. Basta restituire la prima dichiarazione: funziona quando gli anni sono uguali a – jterrace

+0

@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. –

2

Quando ottenete il vostro oggetto datetime ...

import datetime 
today = datetime.datetime.now() 
start = datetime.datetime(2012, 9, 5) 

... è possibile inoltre utilizzare isocalendar ...

today.isocalendar() 
>>> (2012, 33, 1) 
start.isocalendar() 
>>> (2012, 36, 3) 

Questo 3-tupla restituisce l'anno, settimana dell'anno e il giorno della settimana. Se ti interessa solo un anno, allora puoi semplicemente sottrarre i valori della "settimana dell'anno" (potrei trovarne uno qui ..). Altrimenti, dovrai coinvolgere l'anno.

0

One-liner:

datetime.date.isocalendar(datetime.date.today())[1] - datetime.date(2012, 8, 1).isocalendar()[1] + 1 
+0

Sfortunatamente, questo non funziona sui confini dell'anno –

+0

Non male, sembra funzionare bene. In ogni caso può essere modificato per restituire numeri negativi se è prima della data di inizio? – imns

+0

@ Preet Kukreti cosa intendi per limiti dell'anno? – imns

0

mio one-liner esteso per includere anno confini:

start_date = datetime.date(2012, 8, 1) 
print ((datetime.date.isocalendar(datetime.date.today())[0]-datetime.date.isocalendar(start_date)[0])*52)+(datetime.date.isocalendar(datetime.date.today())[1]-datetime.date.isocalendar(start_date)[1])+1 
>>> 3 

Nota: Questa funzione sarà ancora tornare valori negativi se start_date è nel futuro (da oggi)!

Problemi correlati