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

Рейтинг: 0Ответов: 1Опубликовано: 03.02.2023

столкнулся с такой задачкой

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

Даты начала и окончания этапов содержатся в excel файле (Stages.xlsx): датасет stages_data

Даты выходных и праздничных дней, содержатся в отдельном excel файле (Holidays.xlsx) и представлены в датасете holidays_data

Для решения задачи использовал функцию np.busday_count, с параметром holidays, который принимает значения из датафрейма holidays_data

Но на выходе получаю следующее сообщение об ошибке :

ValueError: Cannot safely convert provided holidays input into an array of dates

Подскажите в чем может быть проблема ? Поля всех дат, которые используются для расчета, соответствуют типу данных datetime64[ns]

Примеры файлов :

https://disk.yandex.com/i/DlVyCaELXT7NJw (Holidays.xlsx - список дат выходных и праздников)

https://disk.yandex.com/i/7w3PDaXtue_mGQ (Stages.xlsx - даты этапов)

Код :

import numpy as np
import pandas as pd

#читаем данные из файлов
stages_data = 'C:\\Users\\Username\\Desktop\\Stages.xlsx'
holidays_data = 'C:\\Users\\Username\\Desktop\\Holidays.xlsx'

#создаем датафреймы
df_stages = pd.read_excel(stages_data, sheet_name='data')
df_holidays = pd.read_excel(holidays_data, sheet_name='data')

#устанавливаем формат Дата для всех столбцов
df_stages['Начало'] = pd.to_datetime(df_stages['Начало'], format='%d.%m.%Y')
df_stages['Окончание'] = pd.to_datetime(df_stages['Окончание'], format='%d.%m.%Y')
df_holidays['Дата'] = pd.to_datetime(df_holidays['Дата'], format='%d.%m.%Y')

#вычисляем кол-во дней между двумя датами (исключая праздники и выходные)
days = np.busday_count(df_stages['Начало'], df_stages['Окончание'],holidays=[df_holidays])

введите сюда описание изображения

Ответы

▲ 2Принят

Вам необходимо привести значения datetime к единому формату, поскольку np.busday_count() требует datetime типа datetime64[D], а pandas хранит в datetime64:

days = np.busday_count(np.array(df_stages['Начало'].values.astype('datetime64[D]')),
                                np.array(df_stages['Окончание'].values.astype('datetime64[D]')),
                                         holidays=df_holidays["Дата"].values.astype('datetime64[D]'))

days:

array([33, 59,  2], dtype=int64)