Как разбить временной диапазон на ежемесячные запросы? - PullRequest
0 голосов
/ 20 ноября 2018

Рассмотрим этот простой пример

bogus <- function(start_time, end_time){
  print(paste('hey this starts on', start_time, 'until', end_time))
}

start_time <- ymd('2018-01-01')
end_time <- ymd('2018-05-01')

> bogus(start_time, end_time)
[1] "hey this starts on 2018-01-01 until 2018-05-01"

К сожалению, выполнение этого с большим временным диапазоном не работает с моей реальной функцией bogus, поэтому мне нужно разбить исходный временной диапазон на месячные части.

Другими словами, первым вызовом будет bogus(ymd('2018-01-01'), ymd('2018-01-31')), вторым bogus(ymd('2018-02-01'), ymd('2018-02-28')) и т. Д.

Есть ли простой способ использования purrr и lubridate?Спасибо

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Вы ищете что-то вроде:

library(lubridate)

seq_dates <- seq(start_time, end_time - 1, by = "month")

lapply(seq_dates, function(x) print(paste('hey this starts on', x, 'until', ceiling_date(x, unit = "month") - 1)))

Вы также можете сделать короткую фиктивную функцию, такую ​​как:

bogus <- function(start_var, end_var) {

 require(lubridate)

 seq_dates <- seq(as.Date(start_var), as.Date(end_var) - 1, by = "month")

 printed_statement <- lapply(seq_dates, function(x) paste('hey this starts on', x, 'until', ceiling_date(x, unit = "month") - 1))

 for (i in printed_statement) { print(i) }

}

И назвать ее как:

bogus("2018-01-01", "2018-05-01")

Вывод:

[1] "hey this starts on 2018-01-01 until 2018-01-31"
[1] "hey this starts on 2018-02-01 until 2018-02-28"
[1] "hey this starts on 2018-03-01 until 2018-03-31"
[1] "hey this starts on 2018-04-01 until 2018-04-30"

Таким образом, вы можете просто указать минимальную дату начала и максимальную дату окончания и получить все промежуточные значения.

0 голосов
/ 20 ноября 2018

С базой:

seqdate<-seq.Date(start_time,end_time,by="1 month")
dateranges<-data.frame(start.dates=seqdate[1:length(seqdate)-1], 
  end.dates=seqdate[2:length(seqdate)]-1)

  start.dates  end.dates
1  2018-01-01 2018-01-31
2  2018-02-01 2018-02-28
3  2018-03-01 2018-03-31
4  2018-04-01 2018-04-30
...