【问题标题】:count weekdays between sys.date and each date in column in R计算 sys.date 和 R 列中每个日期之间的工作日
【发布时间】:2017-11-21 12:15:04
【问题描述】:

我有一个数据框,其中包含“thedate”列中的日期列表。

对于此列中的每个值,我需要它与 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(), forecasting$thedate, "days") 抛出一个错误: “'to' 的长度必须为 1”大概是因为我指的是整个列,但我不知道如何计算每列的工作日。

有没有办法对此进行调整,以便对于“thedate”列中的每个日期,我可以获得该日期与 sys.date 之间的工作日差异?

【问题讨论】:

    标签: r


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

    【讨论】:

    • 谢谢,但我仍然无法将其应用于整个列,因为该函数一次只能取一个值。您知道如何将其应用于整个列,以便区分 sys.date() 和 'forecasting$thedate' 中的每个日期吗?
    • 太棒了。使用你给我的预测$weekdays
    • 请注意,在德国,我的语言环境设置为在 wday() 函数中从星期日 (1) 开始一周。我对代码进行了另一项更改,以便一周从数字 1=Monday 开始。
    • 哦,谢谢 - 在你做出改变之前,我检查了它在退货时做了什么,它似乎工作正常。我做了 -1 因为我想从第二个值开始添加 195
    • 我检查了,函数 wday() 默认设置为这样,这意味着所有语言环境,所以你应该被覆盖,它是有效的命令。像这样它更具可读性,1 表示周一,2 表示周二,5 表示周五
    猜你喜欢
    • 1970-01-01
    • 2010-09-20
    • 1970-01-01
    • 2018-08-03
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多