R中日期的自定义下限/上限

ruyhziif  于 2023-01-10  发布在  其他
关注(0)|答案(2)|浏览(142)

假设我有一个从startend的日期范围,其中start <- as.Date(2009-11-05), end <- as.Date(2009-12-17)
我想要一个函数,它本质上充当一个自定义的下限/上限,并返回一个日期间隔,其下限是小于或等于“2009-11-05”的“yyyy-mm-23”格式的第一个日期,上限是大于或等于“2009-12-17”的"yyyy-mm-22“格式的第一个日期。
在上例中,函数应返回间隔('2009 -10-23,2009-12-22)。
我试过使用seq.date和length函数,但是看起来很乏味,我想知道是否有更快的解决方案。
谢啦,谢啦

rjzwgtxy

rjzwgtxy1#

我不知道有哪个函数是这样工作的,但我会编写这样的代码:
编号

custom_bound <- function(date, type, ref_day){
  
  obs_day <- lubridate::day(date)

  if(type == "lower"){aux <- -1}
  
  if(type == "upper"){aux <- 1}      
  
  while(obs_day != ref_day ){
    
    date <- date + days(aux)
    
    obs_day <- lubridate::day(date)
    
  }
  
  return(date)
  
}

输出

> custom_bound(date = as.Date("2009-11-05"),type = "lower",ref_day = 23)
[1] "2009-10-23"

> custom_bound(date = as.Date("2009-12-17"),type = "upper",ref_day = 22)
[1] "2009-12-22"
t8e9dugd

t8e9dugd2#

这可能是另一种尝试的方法。使用lubridate创建新的开始日期和结束日期,替换23号和22号。然后,如果开始日期早于23号,则减去一个月。同样,如果结束日期超过22号,则加上一个月。

start <- as.Date("2009-11-05")
end <- as.Date("2009-12-17")

library(lubridate)

my_fun <- function(start, end) {
  new_start <- start
  day(new_start) <- 23
  new_end <- end
  day(new_end) <- 22
  if (day(start) < 23) new_start = new_start %m-% months(1)
  if (day(end) > 22) new_end = new_end %m+% months(1)
  return(interval(new_start, new_end))
}

my_fun(start, end)
    • 产出**
[1] 2009-10-23 UTC--2009-12-22 UTC

相关问题