Подсчитать количество дней между датами, игнорируя выходные - PullRequest
44 голосов
/ 01 сентября 2010

Как рассчитать количество дней между двумя датами без учета выходных?

Ответы [ 14 ]

0 голосов
/ 17 октября 2018

Мое решение также считает последний день.Таким образом, если начало и конец установлены на один и тот же день недели, то ответ будет 1 (например, 17 октября оба).Если начало и конец - 2 последовательных рабочих дня, тогда ответом будет 2 (например, 17 и 18 октября).Он считает целые недели (в каждой из нас будет 2 выходных дня), а затем проверяет дни напоминания, если они содержат выходные дни.

import datetime

def getWeekdaysNumber(start,end):
    numberOfDays = (end-start).days+1
    numberOfWeeks = numberOfDays // 7
    reminderDays = numberOfDays % 7
    numberOfDays -= numberOfWeeks *2
    if reminderDays:
        #this line is creating a set of weekdays for remainder days where 7 and 0 will be Saturday, 6 and -1 will be Sunday
        weekdays = set(range(end.isoweekday(), end.isoweekday() - reminderDays, -1))
        numberOfDays -= len(weekdays.intersection([7,6,0,-1])
    return numberOfDays 

пример использования:

start = date(2018,10,10)
end = date (2018,10,17)
result = getWeekdaysNumber(start,end)`
0 голосов
/ 24 февраля 2018

Используйте этот пакет, называемый бизнес-длительностью в PyPi.

Пример кода:

from business_duration import businessDuration

import pandas as pd

import datetime

start = pd.to_datetime("2010-1-1 00:00:00")

end = pd.to_datetime("2010-3-31 00:00:00")

businessDuration(startdate=start,enddate=end,unit='day')

Out [6]: 62.99927083333333

0 голосов
/ 14 сентября 2017

Это функция, которую я реализовал для измерения количества рабочих дней, необходимых для интеграции кода между филиалами.Не нужно повторять все промежуточные дни, как это делают другие решения, но только в течение первой недели.

Эта проблема может быть разбита на две разные проблемы:

  1. Расчет количества целых недель в интервале : для целой недели число выходных дней всегда равно 2. Это тривиальное целочисленное деление: (todate - fromdate)/7

  2. Расчет количества выходных дней в оставшемся интервале : это можно легко решить с помощью метода подсчета (например, уменьшение карты): sum(map(is_weekend, rem_days)).

def count_working_days(fromdate, todate):
    from datetime import timedelta as td
    def is_weekend(d): return d.weekday() > 4

    # 1st problem
    num_weeks = (todate - fromdate).days/7

    # 2nd problem
    rem_days = (todate - fromdate).days%7
    rem_weekend_days = sum(is_weekend(fromdate + td(days=i+1)) for i in range(rem_days))

    return (todate - fromdate).days - 2*num_weeks - rem_weekend_days

и образец его работы:

>>> for i in range(10): latency(datetime.now(), datetime.now() + timedelta(days=i))
...
0    1    1    1    2    3    4    5    6    6
0 голосов
/ 17 декабря 2013

Я пробовал два верхних ответа (Дейва Уэбба и Нейла), и по некоторым причинам я получал неправильные ответы от обоих.Это могло быть ошибкой с моей стороны, но я пошел с существующей библиотекой на том основании, что она, вероятно, имела больше функциональности и была лучше протестирована для крайних случаев:

https://bitbucket.org/shelldweller/python-bizdatetime

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...