计算sys.date与R中列中每个日期之间的工作日

时间:2017-11-21 12:15:05

标签: r

我的数据框中包含日期列表"日期"。

对于此列中的每个值,我需要在工作日与Sys.Date()之间的差异,然后乘以195。

我想要类似的东西:

Sys.Date()" 2017-11-21"

thedate    | weekdays 
-----------+--------------------------
2017-11-21 | 0 
2017-11-22 | 195 
2017-11-23 | 390 
2017-11-24 | 585
2017-11-25 | 585 (because it's a saturday)  

我的代码如下:

dates <- as.Date("2017-11-21"):as.Date("2020-11-20")
forecasting <- data.frame(thedate = as.Date(dates, origin = "1970-01-01"))
forecasting$weekdays <- 195 * sum(!weekdays(seq(Sys.Date(), forecasting$thedate, "days")) %in% c("Saturday", "Sunday"))

seq(Sys.Date(),预测$ thedate,&#34; days&#34;)会抛出错误: &#34;&#39;到&#39;必须长度为1&#34;大概是因为我指的是整个专栏,但我不知道如何计算每一栏的工作日。

有没有办法对此进行调整,以便对于&#34; thedate&#34;中的每个日期。我在工作日和sys.date之间得到了差异吗?

1 个答案:

答案 0 :(得分:1)

你可以做一个计算特定日期和Sys.Date()之间的工作日数的函数:

nr_bdays <- function(day){
library(lubridate)
  if(day<=Sys.Date()){
    x <- seq.Date(day, Sys.Date(), by="day")
    } else {x <- seq.Date(Sys.Date(), day, by="day")}
return(length(x[grep("1|2|3|4|5", wday(x, week_start=1))])) #counts number of days Monday to Friday excluding weekends 
}

例如

day <- ymd("2017-11-10")
nr_bdays(day)
#[1] 8

以矢量化形式,您可以:

dates <- seq.Date(as.Date("2017-11-21"), as.Date("2017-12-20"), by="day")
sapply(dates, nr_bdays)
#[1]  1  2  3  4  4  4  5  6  7  8  9  9  9 10 11 12 13 14 14 14 15 16 17 18 19 19 19 20 21 22