Как оценить конкретные даты между двумя данными датами - PullRequest
0 голосов
/ 14 мая 2019

У меня есть 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 голосов
/ 15 мая 2019

В базе 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)
}

Дайте мне знать, как это происходит: возможно, мне нужно внести исправление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...