2012-08-14 9 views
5

Dada una fecha de inicio, ¿cómo puedo determinar cuántas "semanas de negocios" ha sido con Python? No puedo dividir por 7 porque eso no me dará la respuesta correcta.python count business weeks

Un ejemplo sería una fecha de inicio del 1 de agosto de 2012 a la fecha actual (13 de agosto de 2012) con una producción de 3 semanas.

Básicamente, estoy tratando de descubrir, desde el comienzo de la temporada de fútbol, ​​cuál es la semana actual (número entero).

He intentado meterme con el módulo de fecha y hora de Pythons, pero ha sido en vano.

Respuesta

7

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.

+0

Puede deshacerse del if/else al final. Simplemente devuelva la primera declaración: funciona cuando los años son los mismos – jterrace

+0

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

2

Al llegar a su objetivo de fecha y hora ...

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

... se puede utilizar, además, isocalendar ...

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

Este 3-tupla devuelve el año, semana del año y el día de la semana. Si solo te importa un año, simplemente puedes restar los valores de la "semana del año" (podría estar apagado aquí). De lo contrario, tendrá que involucrarse el año.

0

de una sola línea:

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

Desafortunadamente, esto no funciona en las fronteras de año –

+0

No está mal, parece funcionar bien. De todos modos, se puede modificar para devolver los números negativos si es antes de la fecha de inicio? – imns

+0

@ Preet Kukreti ¿a qué te refieres con límites de año? – imns

0

Mi sola línea ampliada para incluir límites año:

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: Esta función seguirá devolviendo los valores negativos si fecha_inicial está en el futuro (a partir de hoy)!