Discussion:
[pyar] Contar dias habiles
Luciano Bovio
2018-02-28 23:32:23 UTC
Permalink
Hola, estoy tratando de encontrar una manera de contar los días hábiles
de cada mes, puede ser el actual o pasado. Es algo genérico así que son
todos los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre días
hábiles.

Lo más simple que encontré es con numpy:

diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')

Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....

Ejemplo:
dias=numpy.busday_count(datetime.date(2018,02,01),datetime.date.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24


Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría
que chequear si 'fecha hasta' es domingo y restar un día

Que recomiendan ?

Saludos Luciano
_______________________________________________
Lista de Correo de PyAr - Python Argentina - ***@python.org.ar
Sitio web: http://www.python.org.ar/

Para administrar la lista (o desuscribirse) entrar a http://listas.python.org.ar/listinfo/pyar

La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de Argentina - http://www.usla.org
Javier Pepe
2018-03-01 00:32:11 UTC
Permalink
Luciano

Posiblemente la funcion este tomando los dias dentro del intervalo de
fechas, podrias sumar un dia a enddate y despues realizar la cuenta.

Saludos
Hola, estoy tratando de encontrar una manera de contar los días hábiles de
cada mes, puede ser el actual o pasado. Es algo genérico así que son todos
los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre días
hábiles.
diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')
Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....
dias=numpy.busday_count(datetime.date(2018,02,01),datetime.
date.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24
Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría que
chequear si 'fecha hasta' es domingo y restar un día
Que recomiendan ?
Saludos Luciano
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
Federico Jurio
2018-03-01 03:38:11 UTC
Permalink
Podés usar el módulo rrule
<http://dateutil.readthedocs.io/en/stable/rrule.html>
Te dejo un snippet que resuelve la cantidad de días hábiles considerando
los Sábados para el mes de Enero 2018.

import datetime
from dateutil import rrule

start_date = datetime.date(2018, 1, 1)
end_date = datetime.date(2018, 1, 31)

dates = rrule.rruleset()

# start_date y end_date estan incluidos en dates
dates.rrule(
rrule.rrule(
rrule.DAILY,
dtstart=start_date,
until=end_date
)
)

# Excluimos los dias
dates.exrule(
rrule.rrule(
rrule.DAILY,
byweekday=rrule.SU,
# Ejemplo si quisieramos excluir Sabados y Domingos
# byweekday=(rrule.SA, rrule.SU),
dtstart=start_date
)
)

dates.rrule(
rrule.rrule(rrule.DAILY, dtstart=start_date, until=end_date)
)

print(len(list(dates)))

Saludos
Post by Luciano Bovio
Luciano
Posiblemente la funcion este tomando los dias dentro del intervalo de
fechas, podrias sumar un dia a enddate y despues realizar la cuenta.
Saludos
Hola, estoy tratando de encontrar una manera de contar los días hábiles
de cada mes, puede ser el actual o pasado. Es algo genérico así que son
todos los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre días
hábiles.
diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')
Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....
dias=numpy.busday_count(datetime.date(2018,02,01),datetime.d
ate.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24
Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría que
chequear si 'fecha hasta' es domingo y restar un día
Que recomiendan ?
Saludos Luciano
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
--
*Federico Daniel Jurio*
Analista de Sistemas
TE: +54 9 11 6428 7919
Skype: fdjurio

[image: LinkedIn] <https://www.linkedin.com/in/juriofederico> [image:
GitHub] <https://github.com/FedericoJurio> [image: Facebook]
<https://www.facebook.com/juriofederico>
Sofi Denner
2018-03-01 10:57:30 UTC
Permalink
El módulo calendar te puede servir para lo que estas necesitando.

calendar.monthcalendar(year, month) te devuelve una matriz donde cada fila
es una semana (colocando 0 en los días de la semana que no están incluidos
en el mes). Con esta función podrías contar la cantidad de domingos que
tiene el mes.

calendar.monthrange(year, month) te devuelve una tupla, cuyo segundo
elemento es la cantidad de días del mes. Restando la cantidad de días - la
cantidad de domingos obtendrías los días hábiles.


import calendar

sundays = len([1 for week in calendar.monthcalendar(2018, 2) if week[6] !=
0])
bus_days = calendar.monthcalendar(2018, 2)[1] - sundays



Espero te sirva.

Saludos!
Post by Federico Jurio
Podés usar el módulo rrule
<http://dateutil.readthedocs.io/en/stable/rrule.html>
Te dejo un snippet que resuelve la cantidad de días hábiles considerando
los Sábados para el mes de Enero 2018.
import datetime
from dateutil import rrule
start_date = datetime.date(2018, 1, 1)
end_date = datetime.date(2018, 1, 31)
dates = rrule.rruleset()
# start_date y end_date estan incluidos en dates
dates.rrule(
rrule.rrule(
rrule.DAILY,
dtstart=start_date,
until=end_date
)
)
# Excluimos los dias
dates.exrule(
rrule.rrule(
rrule.DAILY,
byweekday=rrule.SU,
# Ejemplo si quisieramos excluir Sabados y Domingos
# byweekday=(rrule.SA, rrule.SU),
dtstart=start_date
)
)
dates.rrule(
rrule.rrule(rrule.DAILY, dtstart=start_date, until=end_date)
)
print(len(list(dates)))
Saludos
Post by Luciano Bovio
Luciano
Posiblemente la funcion este tomando los dias dentro del intervalo de
fechas, podrias sumar un dia a enddate y despues realizar la cuenta.
Saludos
Hola, estoy tratando de encontrar una manera de contar los días hábiles
de cada mes, puede ser el actual o pasado. Es algo genérico así que son
todos los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre días
hábiles.
diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')
Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....
dias=numpy.busday_count(datetime.date(2018,02,01),datetime.date.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24
Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría que
chequear si 'fecha hasta' es domingo y restar un día
Que recomiendan ?
Saludos Luciano
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
--
*Federico Daniel Jurio*
Analista de Sistemas
TE: +54 9 11 6428 7919
Skype: fdjurio
GitHub] <https://github.com/FedericoJurio> [image: Facebook]
<https://www.facebook.com/juriofederico>
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
Augusto Tononi
2018-03-01 11:16:02 UTC
Permalink
No te sirve iterar sobre el mes y poner not in ['SA', 'SU' ]?
Después usas len y listo
Post by Sofi Denner
El módulo calendar te puede servir para lo que estas necesitando.
calendar.monthcalendar(year, month) te devuelve una matriz donde cada fila
es una semana (colocando 0 en los días de la semana que no están incluidos
en el mes). Con esta función podrías contar la cantidad de domingos que
tiene el mes.
calendar.monthrange(year, month) te devuelve una tupla, cuyo segundo
elemento es la cantidad de días del mes. Restando la cantidad de días - la
cantidad de domingos obtendrías los días hábiles.
import calendar
sundays = len([1 for week in calendar.monthcalendar(2018, 2) if week[6] !=
0])
bus_days = calendar.monthcalendar(2018, 2)[1] - sundays
Espero te sirva.
Saludos!
El jue., 1 de mar. de 2018 a la(s) 00:38, Federico Jurio <
Post by Federico Jurio
Podés usar el módulo rrule
<http://dateutil.readthedocs.io/en/stable/rrule.html>
Te dejo un snippet que resuelve la cantidad de días hábiles considerando
los Sábados para el mes de Enero 2018.
import datetime
from dateutil import rrule
start_date = datetime.date(2018, 1, 1)
end_date = datetime.date(2018, 1, 31)
dates = rrule.rruleset()
# start_date y end_date estan incluidos en dates
dates.rrule(
rrule.rrule(
rrule.DAILY,
dtstart=start_date,
until=end_date
)
)
# Excluimos los dias
dates.exrule(
rrule.rrule(
rrule.DAILY,
byweekday=rrule.SU,
# Ejemplo si quisieramos excluir Sabados y Domingos
# byweekday=(rrule.SA, rrule.SU),
dtstart=start_date
)
)
dates.rrule(
rrule.rrule(rrule.DAILY, dtstart=start_date, until=end_date)
)
print(len(list(dates)))
Saludos
Post by Luciano Bovio
Luciano
Posiblemente la funcion este tomando los dias dentro del intervalo de
fechas, podrias sumar un dia a enddate y despues realizar la cuenta.
Saludos
Hola, estoy tratando de encontrar una manera de contar los días hábiles
de cada mes, puede ser el actual o pasado. Es algo genérico así que son
todos los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre
días hábiles.
diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')
Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....
dias=numpy.busday_count(datetime.date(2018,02,01),
datetime.date.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24
Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría que
chequear si 'fecha hasta' es domingo y restar un día
Que recomiendan ?
Saludos Luciano
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
--
*Federico Daniel Jurio*
Analista de Sistemas
TE: +54 9 11 6428 7919
Skype: fdjurio
GitHub] <https://github.com/FedericoJurio> [image: Facebook]
<https://www.facebook.com/juriofederico>
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
Augusto Tononi
2018-03-01 11:29:15 UTC
Permalink
start = datetime(2018, 1, 1)
end = datetime(2018, 10, 6)
delta = timedelta(days=1)
d = start
diff = 0
weekend = set([5, 6])
while d <= end:
If d.weekday() not in weekend:
diff += 1
d += delta

Weekday te trae los días de la semana, 5 y 6 son sábado y domingo
respectivamente. Después dentro del while vas aumentando la fecha de a un
día
Fíjate si están bien los espacios porque lo mande por el celu 😅
Post by Augusto Tononi
No te sirve iterar sobre el mes y poner not in ['SA', 'SU' ]?
Después usas len y listo
Post by Sofi Denner
El módulo calendar te puede servir para lo que estas necesitando.
calendar.monthcalendar(year, month) te devuelve una matriz donde cada
fila es una semana (colocando 0 en los días de la semana que no están
incluidos en el mes). Con esta función podrías contar la cantidad de
domingos que tiene el mes.
calendar.monthrange(year, month) te devuelve una tupla, cuyo segundo
elemento es la cantidad de días del mes. Restando la cantidad de días - la
cantidad de domingos obtendrías los días hábiles.
import calendar
sundays = len([1 for week in calendar.monthcalendar(2018, 2) if week[6]
!= 0])
bus_days = calendar.monthcalendar(2018, 2)[1] - sundays
Espero te sirva.
Saludos!
El jue., 1 de mar. de 2018 a la(s) 00:38, Federico Jurio <
Post by Federico Jurio
Podés usar el módulo rrule
<http://dateutil.readthedocs.io/en/stable/rrule.html>
Te dejo un snippet que resuelve la cantidad de días hábiles considerando
los Sábados para el mes de Enero 2018.
import datetime
from dateutil import rrule
start_date = datetime.date(2018, 1, 1)
end_date = datetime.date(2018, 1, 31)
dates = rrule.rruleset()
# start_date y end_date estan incluidos en dates
dates.rrule(
rrule.rrule(
rrule.DAILY,
dtstart=start_date,
until=end_date
)
)
# Excluimos los dias
dates.exrule(
rrule.rrule(
rrule.DAILY,
byweekday=rrule.SU,
# Ejemplo si quisieramos excluir Sabados y Domingos
# byweekday=(rrule.SA, rrule.SU),
dtstart=start_date
)
)
dates.rrule(
rrule.rrule(rrule.DAILY, dtstart=start_date, until=end_date)
)
print(len(list(dates)))
Saludos
Post by Luciano Bovio
Luciano
Posiblemente la funcion este tomando los dias dentro del intervalo de
fechas, podrias sumar un dia a enddate y despues realizar la cuenta.
Saludos
Hola, estoy tratando de encontrar una manera de contar los días
hábiles de cada mes, puede ser el actual o pasado. Es algo genérico así que
son todos los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre
días hábiles.
diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')
Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....
dias=numpy.busday_count(datetime.date(2018,02,01),datetime.
date.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24
Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría que
chequear si 'fecha hasta' es domingo y restar un día
Que recomiendan ?
Saludos Luciano
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
--
*Federico Daniel Jurio*
Analista de Sistemas
TE: +54 9 11 6428 7919
Skype: fdjurio
GitHub] <https://github.com/FedericoJurio> [image: Facebook]
<https://www.facebook.com/juriofederico>
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
Diego RR
2018-03-01 12:08:17 UTC
Permalink
Podrías probar:

from calendar import monthrange, weekday, SUNDAY

year, month = 2017, 12
days = monthrange(year, month) # (4, 31)
sundays = filter(lambda d: weekday(year, month, d+1) == SUNDAY,
range(days[1]))
print days[1] - len(sundays)
Post by Augusto Tononi
No te sirve iterar sobre el mes y poner not in ['SA', 'SU' ]?
Después usas len y listo
Post by Sofi Denner
El módulo calendar te puede servir para lo que estas necesitando.
calendar.monthcalendar(year, month) te devuelve una matriz donde cada
fila es una semana (colocando 0 en los días de la semana que no están
incluidos en el mes). Con esta función podrías contar la cantidad de
domingos que tiene el mes.
calendar.monthrange(year, month) te devuelve una tupla, cuyo segundo
elemento es la cantidad de días del mes. Restando la cantidad de días - la
cantidad de domingos obtendrías los días hábiles.
import calendar
sundays = len([1 for week in calendar.monthcalendar(2018, 2) if week[6]
!= 0])
bus_days = calendar.monthcalendar(2018, 2)[1] - sundays
Espero te sirva.
Saludos!
El jue., 1 de mar. de 2018 a la(s) 00:38, Federico Jurio <
Post by Federico Jurio
Podés usar el módulo rrule
<http://dateutil.readthedocs.io/en/stable/rrule.html>
Te dejo un snippet que resuelve la cantidad de días hábiles considerando
los Sábados para el mes de Enero 2018.
import datetime
from dateutil import rrule
start_date = datetime.date(2018, 1, 1)
end_date = datetime.date(2018, 1, 31)
dates = rrule.rruleset()
# start_date y end_date estan incluidos en dates
dates.rrule(
rrule.rrule(
rrule.DAILY,
dtstart=start_date,
until=end_date
)
)
# Excluimos los dias
dates.exrule(
rrule.rrule(
rrule.DAILY,
byweekday=rrule.SU,
# Ejemplo si quisieramos excluir Sabados y Domingos
# byweekday=(rrule.SA, rrule.SU),
dtstart=start_date
)
)
dates.rrule(
rrule.rrule(rrule.DAILY, dtstart=start_date, until=end_date)
)
print(len(list(dates)))
Saludos
Post by Luciano Bovio
Luciano
Posiblemente la funcion este tomando los dias dentro del intervalo de
fechas, podrias sumar un dia a enddate y despues realizar la cuenta.
Saludos
Hola, estoy tratando de encontrar una manera de contar los días
hábiles de cada mes, puede ser el actual o pasado. Es algo genérico así que
son todos los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre
días hábiles.
diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')
Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....
dias=numpy.busday_count(datetime.date(2018,02,01),datetime.
date.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24
Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría que
chequear si 'fecha hasta' es domingo y restar un día
Que recomiendan ?
Saludos Luciano
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
--
*Federico Daniel Jurio*
Analista de Sistemas
TE: +54 9 11 6428 7919
Skype: fdjurio
GitHub] <https://github.com/FedericoJurio> [image: Facebook]
<https://www.facebook.com/juriofederico>
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
--
*Diego R. Riquelme*
Germán L. Osella Massa
2018-03-01 22:49:33 UTC
Permalink
Hola Luciano,

Efectivamente numpy.busday_count() excluye en el cómputo a las fechas dadas
en enddates, siguiendo la costumbre de como se suelen definir los
intervalos en Python (pensá en los índices de una lista o un range()).

Para cambiar eso, lo más fácil sería incrementar la fecha final en un día
haciendo, por ejemplo, datetime.date.today() + datetime,timedelta(days=1) (y
que funciona incluso si enddates es un array conteniendo más de una fecha).

Eso arrojaría el resultado que buscás (ya que contempla también al día
final del rango).

Ahora, si no querés/necesitás tener a Numpy como dependencia, podés
calcularlo fácilmente (y sin necesidad de contar uno por uno todos los
domingos, que la electricidad está cada vez más cara ;-):

Si inicio y fin contienen los dos extremos del rango de fechas que querés
procesar (begindates y enddates en busday_count()), se puede calcular la
cantidad total de días entre esas dos fechas haciendo:

dias = (fin - inicio).days

Podemos ver cuantas semanas completas hay en esa cantidad de días
dividiéndolos por 7, lo que puede arrojar además un resto ya que no
necesariamente habrán semanas completas:

semanas, resto = divmod(dias, 7)

Sabemos que por cada semana completa tenemos un domingo.

Ahora, puede suceder que los días que nos sobran estuvieran todos antes de
la primer semana completa, todos después de la última semana completa o,
más probablemente, repartidos entre ambos casos.
Si tuviéramos al menos a uno de esos días antes de la primer semana
completa, tendríamos que incluir un domingo extra en la cuenta.

Sabiendo el día de la semana de la fecha de inicio (inicio.weekday()), si
es un lunes (inicio.weekday() == 0), es una semana completa y ya está
contemplada en la cuenta anterior.
Si, en cambio, es un martes (inicio.weekday() == 1), tenemos 6 días antes
de la primer semana completa.
Si fuera un miércoles (inicio.weekday() == 2), tenemos 5 días.
Si fuera un jueves (inicio.weekday() == 3), tenemos 4 días.
Si fuera un viernes (inicio.weekday() == 4), tenemos 3 días.
Si fuera un sábado (inicio.weekday() == 5), tenemos 2 días.
Y si fuera un domingo (inicio.weekday() == 6), tenemos sólo 1 día.

Así, si los días que nos sobran son igual o más que los que necesitamos
para llenar la primera semana incompleta, agregamos un domingo más a la
cantidad calculada.

if resto >= 7 - inicio.weekday():
semanas += 1

Finalmente, calculamos la cantidad de días hábiles como la cantidad de días
entre esas fechas menos la cantidad de domingos (o semanas) que hubo:

dias_hábiles = dias - semanas

En resumen:

def dias_hábiles(inicio, fin):
dias = (fin - inicio).days
semanas, resto = divmod(dias, 7)
if resto >= 7 - inicio.weekday():
semanas += 1
return dias - semanas

Así,
dias_hábiles(datetime.date(2018, 2, 1), datetime.date(2018, 2, 28) +
datetime.timedelta(days=1))
24

Además, las fechas no tienen por qué iniciar o terminar dentro de un mismo
dias_hábiles(datetime.date(2018, 1, 1), datetime.date(2019, 1, 1))
313

313 (que es igual a 365 menos los 52 domingos que hubo en el 2018) sería la
cantidad de días hábiles en ese año (módulo feriados y demás ocasiones no
consideradas ;-)

Saludos,
Germán
Hola, estoy tratando de encontrar una manera de contar los días hábiles de
cada mes, puede ser el actual o pasado. Es algo genérico así que son todos
los días menos los domingos.
Además tengo que calcular un porcentaje de días transcurridos/sobre días
hábiles.
diashabiles=numpy.busday_count(desde,hasta,weekmask='1111110')
Funciona perfecto excepto que no me cuenta el día de 'fecha
hasta'(enddates).....
dias=numpy.busday_count(datetime.date(2018,02,01),datetime.
date.today(),weekmask='1111110')
da como resultado 23 y necesitaría 24
Lo que se me ocurre es sumarle un día a 'fecha hasta' lo cual funciona
siempre y cuando la 'fecha hasta' no sea domingo, para lo cual tendría que
chequear si 'fecha hasta' es domingo y restar un día
Que recomiendan ?
Saludos Luciano
_______________________________________________
Sitio web: http://www.python.org.ar/
Para administrar la lista (o desuscribirse) entrar a
http://listas.python.org.ar/listinfo/pyar
La lista de PyAr esta Hosteada en USLA - Usuarios de Software Libre de
Argentina - http://www.usla.org.ar
Loading...