如何找到下一个特定的日子?

时间:2015-09-07 08:48:36

标签: r lubridate

我需要在下周五找到所有'对应于一组日期。

例如2015-08-03(2015年8月3日,星期一)作为输入应返回2015-08-07(2015年8月7日,星期五)作为输出。

在阅读lubridate's vignette时,我无法找到管理此需求的方法,您将如何进行?

library(lubridate) 
date <- "2015-08-03"
date <- wmd(date)
wday(date, label = TRUE)

4 个答案:

答案 0 :(得分:3)

尝试此功能:

nextweekday <- function(date, wday) {
  date <- as.Date(date)
  diff <- wday - wday(date)
  if( diff < 0 )
    diff <- diff + 7
  return(date + diff)
}

您插入日期和所需的日期(星期日= 1,星期一= 2,...)并获得您想要的结果。

答案 1 :(得分:2)

library(lubridate) 

nextFriday <- function(date) {
  date <- ymd(date)
  .day <- wday(date, label = TRUE)
  shift <- ifelse(as.numeric(.day) < 6, 0, 7)
  date + days(6 - as.numeric(.day) + shift)
}

nextFriday("2015-08-03")

答案 2 :(得分:1)

Thx Kiril 太棒了!节省了我很多工作?????
如果我想将其应用到已经以小标题格式的dateformat设置的矢量中,则该代码将不起作用,因此这是您的代码的一个小调整:

nextweekday <- function(fdate, wk_day) {
diff <- wk_day- wday(fdate)
diff=if_else(diff<0,diff+7,diff)
return(fdate + diff)
}

答案 3 :(得分:0)

您也可以使用模数和整数除法来实现。

例如,对于星期五,请检查以下内容:

library(lubridate)

next_friday <- function(dates) {
  dates + days((5 - wday(dates) %% 6) + (wday(dates) %/% 6))
}

例如:

> dates <- sample(seq(ymd('2020-01-01'),ymd('2021-01-01'), by='days'), 20)
> dates
 [1] "2020-06-28" "2020-03-22" "2020-07-15" "2020-01-16" "2020-08-01" "2020-05-16" "2020-10-20" "2020-11-03"
 [9] "2020-08-25" "2020-10-07" "2020-04-18" "2020-12-11" "2020-05-20" "2020-08-09" "2020-01-10" "2020-05-21"
[17] "2020-10-24" "2020-03-06" "2020-05-19" "2020-09-08"

> next_friday(dates)
 [1] "2020-07-02" "2020-03-26" "2020-07-16" "2020-01-16" "2020-08-06" "2020-05-21" "2020-10-22" "2020-11-05"
 [9] "2020-08-27" "2020-10-08" "2020-04-23" "2020-12-17" "2020-05-21" "2020-08-13" "2020-01-16" "2020-05-21"
[17] "2020-10-29" "2020-03-12" "2020-05-21" "2020-09-10"

> wday(next_friday(dates))
 [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5