Как я могу в R умно найти начало и конец предыдущих периодов времени? - PullRequest
2 голосов
/ 17 апреля 2019

Я бы хотел в R найти предыдущие периоды, начиная и заканчивая. Период определяется в минутах.

Буду рад выводу, как показано ниже.

library(lubridate)
timeNow <- now()
timeNow
# [1] "2019-04-17 11:17:09 CEST"

periodLength <- 60    #minutes
previousPeriodStart(timeNow, periodLength)
# [1] "2019-04-17 10:00:00 CEST"
previousPeriodEnd(timeNow, periodLength)
# [1] "2019-04-17 10:59:59 CEST"

periodLength <- 5    #minutes
previousPeriodStart(timeNow, periodLength)
# [1] "2019-04-17 11:10:00 CEST"
previousPeriodEnd(timeNow, periodLength)
# [1] "2019-04-17 11:14:59 CEST"

Я понимаю, как построить эти функции в XTS, если у меня был TS с данными. Поскольку у меня нет набора данных для этого примера, я не могу использовать функции xts to.period. Я просто хочу найти начало и конец.

Каков был бы самый умный способ построения previousPeriodStart и previousPeriodEnd? Или я должен просто начать делать арифметику со временем эпохи / юникса?

Большое спасибо заранее.

--- РЕДАКТИРОВАТЬ ---- После получения ответа с функцией, которая отвечает как на начало, так и на конец в одной и той же функции, это, конечно, намного умнее.

Ответы [ 3 ]

3 голосов
/ 17 апреля 2019

С lubridate это легко сделать:

previousPeriod <- function(timeNow,periodLength)
{
  start <- floor_date(timeNow - minutes(60),"hour")
  end <- ceiling_date(timeNow - minutes(60),"hour") - seconds(1)
  return(c(start=start,end=end))
}

previousPeriod(timeNow,periodLength)

                    start                       end 
"2019-04-17 10:00:00 UTC" "2019-04-17 10:59:59 UTC" 
3 голосов
/ 17 апреля 2019

Как то так?

library(lubridate)
timeNow <- now()

period = 60

floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)
floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)+minutes(period)-seconds(1)

period = 5

floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)
floor_date(timeNow, unit="hour")-minutes(period)+minutes( trunc(minute(timeNow)/period)*period)+minutes(period)-seconds(1)
1 голос
/ 17 апреля 2019

Опираясь на оба других ответа с использованием floor_date, я улучшил самый быстрый ответ, добавив также рабочий код для других минутных интервалов, чем полный час.

previousPeriods <- function(timeNow, periodLength)
{
  periodPhrase <- paste0(periodLength, " mins")  # To create periods such as "5 mins"
  start <- floor_date(timeNow - minutes(periodLength), periodPhrase)
  end <- ceiling_date(timeNow - minutes(periodLength), periodPhrase) - seconds(1)
  return(c(start=start,end=end))
}

Еще раз спасибо за помощь в быстрых ответах.

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