我的数据框中包含日期列表"日期"。
对于此列中的每个值,我需要在工作日与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之间得到了差异吗?
答案 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