python - 如何使用 Pandas CDay 查找日期之间的工作日?

标签 python pandas datetime numpy

我定义了一个存储假期的 Pandas CDay() 对象。我如何使用它来计算两个日期之间的工作日数?

我知道 np.busday_count,但我的日历恰好是 Pandas CDay

最佳答案

您可以简单地将周掩码和假期从CDay 日历直接传递给np.busday_count。 .

np.busday_count(start_date, end_date,
                weekmask=bday_custom.weekmask, holidays=bday_custom.holidays)

或者(但肯定更慢),您可以使用 pd.date_range ,并将您的自定义 CDay 日历作为 freq 传递。

pd.date_range(datetime(2017, 3, 5), datetime(2017, 3, 12), freq=bday_cust).size

这有一个不幸的副作用,即创建一个仅使用其大小的中间日期范围。


示例

让我们设置一个无意义的自定义工作日日历。

from pandas.tseries.offsets import CustomBusinessDay
weekmask = 'Mon Wed Fri Sat'
holidays = [datetime(2017, 3, 6), datetime(2017, 3, 11)]

bday_cust = CustomBusinessDay(holidays=holidays, weekmask=weekmask) 

现在,我们已将 3 月 5 日至 11 日这一周的星期一和星期六设置为工作日(和节假日)。现在查看该特定日期范围,我们可以计算剩余工作日 (2)

>>> np.busday_count(datetime(2017, 3, 5), datetime(2017, 3, 12),
                    weekmask=bday_custom.weekmask, 
                    holidays=bday_custom.holidays)
2
>>> pd.date_range(datetime(2017, 3, 5), datetime(2017, 3, 12), freq=bday_cust).size
2

粗略的示例基准

%timeit np.busday_count(datetime(2017, 3, 5), datetime(2017, 3, 12),
                        weekmask=bday_custom.weekmask, 
                        holidays=bday_custom.holidays)
100000 loops, best of 3: <b>17.2 us per loop</b>

% timeit pd.date_range(datetime(2017, 3, 5), datetime(2017, 3, 12), freq=bday_cust).size
1000 loops, best of 3: <b>573 us per loop</b>

关于python - 如何使用 Pandas CDay 查找日期之间的工作日?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42789645/

相关文章:

python openpyxl 在具有函数的单元格中导入数据

python - 同一位置周围多次出现边界框

Python 老化时间

c# - 如何用零格式化或填充字符串日期?

python - 当我写入 python 子进程标准输入管道时,为什么数据丢失?

python - 无法打印 df.shape,我从 pandas 中以数据帧格式读取它

python - 从特定字符后的字符串中提取数字

python - 我们可以在函数映射需要超过 1 个参数的地方应用 pandas.map() 吗?

python : "Pandas data cast to numpy dtype of object. Check input data with np.asarray(data)."

ruby-on-rails - 如何按星期几 ruby​​ 获取日期