如何找到下一个特定的日子?
How to find next particular day?
我需要找到与一组日期对应的所有 'next friday'。
例如 2015-08-03(2015 年 8 月 3 日,星期一)作为输入应 return2015-08-07(2015 年 8 月 7 日,星期五)作为输出。
我在阅读 lubridate's vignette 时找不到满足此需求的方法,您将如何进行?
library(lubridate)
date <- "2015-08-03"
date <- wmd(date)
wday(date, label = TRUE)
Lubridate 提供了一个很好的函数持续时间。您可以使用它向当前日期添加天数。
通常最好不要创建与函数同名的变量(即日期)。
the_date <- "2015-08-03"
the_date <- ymd(the_date)
wday(the_date, label = TRUE)
next_friday <- function(given_date){
n_days_to_fri <- 6 - wday(given_date)
z <- given_date + duration(n_days_to_fri, "days")
return(z)
}
next_friday(the_date)
[1] "2015-08-07 UTC"
wday(next_friday(the_date), label = TRUE)
[1] Fri
Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat
试试这个功能:
nextweekday <- function(date, wday) {
date <- as.Date(date)
diff <- wday - wday(date)
if( diff < 0 )
diff <- diff + 7
return(date + diff)
}
您输入您的日期和所需的工作日(星期日 = 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")
谢谢基里尔
这太棒了!并且让我省了很多很多工作
如果我想将代码应用于已经采用 tibble 格式的日期格式的矢量,则代码不起作用,因此这里是您的代码的一个小调整:
nextweekday <- function(fdate, wk_day) {
diff <- wk_day- wday(fdate)
diff=if_else(diff<0,diff+7,diff)
return(fdate + diff)
}
你也可以用模和整数除法来完成。
例如,对于星期五,请检查以下内容:
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
我需要找到与一组日期对应的所有 'next friday'。
例如 2015-08-03(2015 年 8 月 3 日,星期一)作为输入应 return2015-08-07(2015 年 8 月 7 日,星期五)作为输出。
我在阅读 lubridate's vignette 时找不到满足此需求的方法,您将如何进行?
library(lubridate)
date <- "2015-08-03"
date <- wmd(date)
wday(date, label = TRUE)
Lubridate 提供了一个很好的函数持续时间。您可以使用它向当前日期添加天数。
通常最好不要创建与函数同名的变量(即日期)。
the_date <- "2015-08-03"
the_date <- ymd(the_date)
wday(the_date, label = TRUE)
next_friday <- function(given_date){
n_days_to_fri <- 6 - wday(given_date)
z <- given_date + duration(n_days_to_fri, "days")
return(z)
}
next_friday(the_date)
[1] "2015-08-07 UTC"
wday(next_friday(the_date), label = TRUE)
[1] Fri
Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat
试试这个功能:
nextweekday <- function(date, wday) {
date <- as.Date(date)
diff <- wday - wday(date)
if( diff < 0 )
diff <- diff + 7
return(date + diff)
}
您输入您的日期和所需的工作日(星期日 = 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")
谢谢基里尔
这太棒了!并且让我省了很多很多工作
如果我想将代码应用于已经采用 tibble 格式的日期格式的矢量,则代码不起作用,因此这里是您的代码的一个小调整:
nextweekday <- function(fdate, wk_day) {
diff <- wk_day- wday(fdate)
diff=if_else(diff<0,diff+7,diff)
return(fdate + diff)
}
你也可以用模和整数除法来完成。
例如,对于星期五,请检查以下内容:
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