在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中动态计算不包括假期日历的工作日数的主要内容,如果未能解决你的问题,请参考以下文章