【问题标题】:How to evaluate specific dates between two given dates如何评估两个给定日期之间的特定日期
【发布时间】:2019-05-14 20:42:54
【问题描述】:

我有 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”

Example#2 中的正确结果应该是 [1] "2019-02-28" "2019-08-31" "2020-02-28"

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

【问题讨论】:

  • 嘿,您能否提供数据作为最小可重现示例以及您的代码打算做什么。
  • 好的,我已经更新了
  • sdate 是开始日期吗?
  • 这也只能追溯到 12 个月吗?如果没有,那就改变了问题。
  • 我只是做了一个更好的解释,希望有所帮助

标签: r


【解决方案1】:

在基础 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)
}

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

【讨论】:

    猜你喜欢
    • 2017-04-22
    • 2015-07-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多