在Python中动态计算不含假期的工作日数量

3 投票
1 回答
2004 浏览
提问于 2025-06-18 04:01

我想计算两个日期之间的工作日数量,并在一个新的 pandas 数据框中添加这一列。我还有一个假期日历,想在计算时把假期日期排除掉。

我查了一下,发现 numpy 的 busday_count 函数很有用。这个函数可以计算两个日期之间的工作日数量,还可以让你加入假期日历。

我还发现了一个叫 holidays 的包,它可以提供不同国家的假期日期。我觉得把这个假期日历加到 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 个回答

0

这个应该可以正常运行:

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()

撰写回答