在Python中动态计算不包括假期日历的工作日数

Posted

技术标签:

【中文标题】在Python中动态计算不包括假期日历的工作日数【英文标题】:Dynamically count number of business days excluding holiday calendar in Python 【发布时间】:2020-09-04 17:08:57 【问题描述】:

我想计算两个日期之间的工作日数,并用这些天数创建一个新的 pandas 数据框列。我还有一个假期日历,我想在计算时排除假期日历中的日期。

我环顾四周,发现 numpy busday_count 函数是一个有用的工具。该函数计算两个日期之间的工作日数,还允许您包含假期日历。

我还环顾四周,看到了假期套餐,它为我提供了不同国家/地区的假期日期。我认为将这个假期日历添加到 numpy 函数中会很棒。

然后我进行如下操作;

import pandas as pd
import numpy as np
import holidays
from datetime import datetime, timedelta, date

df = 'start' : ['2019-01-02', '2019-02-01'],
       'end' : ['2020-01-04', '2020-03-05']
    
df = pd.DataFrame(df)

holidays_country = holidays.CountryHoliday('UnitedKingdom')
start_date = [d.date for d in df['start']]
end_date = [d.date for d in df['end']]
holidays_numpy = holidays_country[start_date:end_date]

df['business_days'] = np.busday_count(begindates = start_date,
                                      enddates = end_date,
                                      holidays=holidays_numpy)

当我运行这段代码时,它会抛出这个错误TypeError: Cannot convert type '<class 'list'>' to date

当我进一步查看时,我注意到 start_date 和 end_date 是列表,这可能是错误发生的原因。

然后我将 holidays_numpy 变量更改为 holidays_numpy = holidays_country['2019-01-01':'2019-12-31'] 并且它起作用了。

但是,由于我的数据帧中每一行的日期都不同,有没有办法在我的 holiday_numpy 变量中设置两个参数,以分别从 start_date 和 end_date 中选择相应的值(就像 zip 函数一样)?

我也对解决此问题的其他方法持开放态度。

【问题讨论】:

嘿!你试过了吗?它现在对你有用吗? 【参考方案1】:

这应该可行:

import pandas as pd
import numpy as np
import holidays 

df = 'start' : ['2019-01-02', '2019-02-01'],
       'end' : ['2020-01-04', '2020-03-05']
df = pd.DataFrame(df)

holidays_country = holidays.CountryHoliday('UK')

def f(x):
  return np.busday_count(x[0],x[1],holidays=holidays_country[x[0]:x[1]])

df['business_days'] = df[['start','end']].apply(f,axis=1)

df.head()

【讨论】:

以上是关于在Python中动态计算不包括假期日历的工作日数的主要内容,如果未能解决你的问题,请参考以下文章

Access 2010 计算工作日数

TSQL - 添加迄今为止的工作日,不包括假期

SQL工作日查询

Sql server 查询指定时间区间工作日数休息日数等日期操作

Django的工作日

使用 tkinter 创建日历的最佳方法是啥?