【发布时间】: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