R语言bizdays包add.bizdays函数NA值问题求助
解决bizdays包add.bizdays返回NA的问题
问题描述
我用bizdays包的create.calendar函数创建了哥斯达黎加自定义日历,生成包含2023年所有日期的向量Date_A,需要为每个日期添加8个工作日并存储到Date_B中。但使用add.bizdays函数后,最后19个值返回NA(例如Date_A中的"2023-12-13"应得到"2023-12-26"却返回NA)。
原代码如下:
library(bizdays) library(lubridate) feriados_CR <- as.Date(c( "2023-01-01","2023-01-02","2023-01-03","2023-01-04","2023-01-05","2023-01-06","2023-04-06", "2023-04-07","2023-04-10","2023-05-01","2023-07-24","2023-08-02","2023-08-14","2023-09-03", "2023-09-15","2023-12-01","2023-12-25")) calendar <- create.calendar("Costa_Rica", holidays = feriados_CR, weekdays = c("saturday", "sunday")) Date_A <- seq(ymd("2023-01-01"), ymd("2023-12-31"), by = "days") Date_B <- add.bizdays(Date_A, 8, "Costa_Rica")
问题原因
问题出在create.calendar的默认日期范围设置上。该函数默认将日历的有效日期范围设为节假日向量的最小和最大日期(即min(feriados_CR)到max(feriados_CR)),这里就是2023-01-01到2023-12-25。当Date_A中靠后的日期加8个工作日后,结果会超出2023-12-25(比如2023-12-13加8个工作日得到2023-12-26),超出日历有效范围的日期会返回NA。
解决方案
在创建日历的时候,显式指定end.date参数为一个足够大的日期,确保所有计算结果都在有效范围内。比如设置为2024-01-31,这样就能覆盖2023年底日期加8个工作日后的结果。
修改后的代码:
library(bizdays) library(lubridate) feriados_CR <- as.Date(c( "2023-01-01","2023-01-02","2023-01-03","2023-01-04","2023-01-05","2023-01-06","2023-04-06", "2023-04-07","2023-04-10","2023-05-01","2023-07-24","2023-08-02","2023-08-14","2023-09-03", "2023-09-15","2023-12-01","2023-12-25")) # 显式设置end.date为2024年1月31日,覆盖计算所需的日期范围 calendar <- create.calendar("Costa_Rica", holidays = feriados_CR, weekdays = c("saturday", "sunday"), end.date = as.Date("2024-01-31")) Date_A <- seq(ymd("2023-01-01"), ymd("2023-12-31"), by = "days") Date_B <- add.bizdays(Date_A, 8, "Costa_Rica")
验证结果
修改后,Date_A中的"2023-12-13"会正确返回"2023-12-26",所有日期的计算结果都不会再返回NA。
内容的提问来源于stack exchange,提问作者Israel
相关产品推荐
相关产品推荐

