如何评估两个给定日期之间的特定日期

时间:2019-05-14 20:42:55

标签: r

我有2个约会和一个频率。以最终日期为准,然后每12个月返回一次,直到结果日期小于开始日期为止。 (在示例1下面)。

我有一个代码,可以工作,但是速度很慢,因为要利用while循环。 也有一个例外,例如:如果最后日期是月​​份的最后一天,则所有其他日期也应该是相应月份的最后一天。但是我的代码没有做最后一部分。 (在示例2下)

cpdatesfun<- function(sdate, fdate, frq = 2){
  m <- month(fdate) 
  y <- year(fdate) 
  d <- day(fdate) 
  cp <- fdate 
  dcp <- c()# null
while (as.numeric(cp - sdate)>=0) { #Kind of recursive 
  dcp <- ymd(dcp, cp)
  y = ifelse(m-12/frq <= 0,y-1, y)
  m = ifelse(m-12/frq <= 0, 12 + m-12/frq, m-12/frq)
  dm <- days_in_month(make_date(year = y, month = m, day = 1))
  d = ifelse(dm<d, dm,d)
  cp <- make_date(year = y, month = m, day = d) 
  }
  return(sort(dcp))
}

cpdatesfun(dmy(150119), dmy(200220)) #Example #1 good
cpdatesfun(dmy(150119), dmy(280220)) # Example #2 wrong

[1]“ 2019-02-20”“ 2019-08-20”“ 2020-02-20” [1]“ 2019-02-28”“ 2019-08-28”“ 2020-02-28”

示例2中正确的结果应该是 [1]“ 2019-02-28”“ 2019-08-31”“ 2020-02-28”

我想要一种比while循环更快的方法,并在月末时获得正确的日期。

1 个答案:

答案 0 :(得分:0)

基数R中有一个名为seq.Date的函数,该函数可以获取开始日期和结束日期并创建日期向量。现在将其放入函数中,您可以尝试执行以下操作:

cpdatesfun <- function(sdate, fdate, frq = 2){
   require(lubridate)
   kdate <- ceiling_date(as.Date(fdate), unit = "month") - days(1)
   sdate <- as.Date(sdate)
   newdate <- kdate - years(1)
   vec_date <- seq.Date(newdate, kdate, length.out = frq+1)
   fin_date <- vec_date[which(vec_date >= sdate)]
   return(fin_date)
}

让我知道这是怎么回事:我可能需要进行更正。