Как разбить диапазон дат на 5 дней на много лет? - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь автоматизировать запрос API к Google Analytics с помощью googleAnalyticsR.

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

Последний блок должен занимать последний день с момента последнего вызова API, сумма 1 день. А для end_date это должен быть день до сегодняшнего дня.

Мне бы хотелось разделить большой диапазон, например: от 2017-01-01 до 2020-02-21 кусками по 5 дней, и сделать вызов API с использованием каждого чанка, чтобы API не свернулся.

Ожидаемый data frame вывод:

starts       ends
1  2017-01-01 2017-01-05
2  2017-01-06 2017-01-10
3  2017-01-11 2017-01-15
...
n  2020-02-17 today-minus-1-day

ОБНОВЛЕНИЕ 1:

Я нашел этот похожий код в репозитории Марка на github.

Возвращает df с датами начала и окончания на основе montlhy.

add_months <-  function(date, n){
  seq(date, by = paste (n, "months"), length = 2)[2]
}

make_date_ranges <- function(start, end){

  starts <- seq(from = start,
                to =  Sys.Date()-1 ,
                by = "1 month")

  ends <- c((seq(from = add_months(start, 1),
                 to = end,
                 by = "1 month" ))-1,
            (Sys.Date()-1))

  data.frame(starts,ends)

}

## useage
make_date_ranges(as.Date("2017-01-01"), Sys.Date())

В конце make_date_ranges выводит df с датами начала и окончания, в месячных единицах мне нужно, чтобы он выводил куски диапазона за 5 дней.

1 Ответ

1 голос
/ 22 февраля 2020

После редактирования вопроса, я полагаю, что следующая функция выполняет то, о чем просит вопрос.

make_ranges_day <- function(from, to = Sys.Date(), n = 5){
  from <- as.Date(from)
  to <- if(to == Sys.Date()) Sys.Date() - 1 else as.Date(to)
  by = paste(n, "days")
  starts <- seq(from, to - n + 1, by = by)
  ends <- seq(from + n - 1, to, by = by)
  last <- length(starts)
  remaining <- to - ends[last] + 1
  if(remaining != 0){
    starts <- c(starts, ends[last] + 1)
    ends <- c(ends, to)
  }
  data.frame(starts, ends)
}

chunks <- make_ranges_day("2017-01-01")

head(chunks)
#      starts       ends
#1 2017-01-01 2017-01-05
#2 2017-01-06 2017-01-10
#3 2017-01-11 2017-01-15
#4 2017-01-16 2017-01-20
#5 2017-01-21 2017-01-25
#6 2017-01-26 2017-01-30

tail(chunks)
#        starts       ends
#225 2020-01-26 2020-01-30
#226 2020-01-31 2020-02-04
#227 2020-02-05 2020-02-09
#228 2020-02-10 2020-02-14
#229 2020-02-15 2020-02-19
#230 2020-02-20 2020-02-21
...