【问题标题】:Dynamically count number of business days excluding holiday calendar in Python在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 函数一样)?

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

【问题讨论】:

  • 嘿!你试过了吗?它现在对你有用吗?

标签: python pandas numpy dataframe time-series


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 2015-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    • 1970-01-01
    相关资源
    最近更新 更多