Как извлечь / установить подмножество дней + 0 в день + 1 индекса из подробных данных через xts в R? - PullRequest
4 голосов
/ 28 марта 2012

Я пытаюсь сгенерировать подгруппу временных рядов с разбивкой по дням в XTS.

Например, скажем, у меня есть серия раз в минуту (mts), которая генерируется 24 часа в сутки в течение 10года.Я хочу извлечь, скажем, каждый (с 08:30 утра по t + 0 до 13:30 t + 1) период для каждого «дня» во временных сериях.

Для этого с 08:30 до, скажем,, 16:00 в тот же день с xts тривиально и хорошо решается в StackExchange: т.е. mts["T08:29:59/T16:01:00"]

Но как мне написать эквивалент, где конечная точка подмножества временных рядов - это время, которое происходит нана следующий день?

Любые мысли очень ценятся.

Ответы [ 2 ]

4 голосов
/ 28 марта 2012

Будет создан список, в котором каждый элемент списка является объектом xts, который начинается в 8:30 и заканчивается в 13:30 следующего дня.

D <- split(mts, "days")
mts.days <- lapply(seq_along(D) - 1, function(i) {
  if (i > 0) rbind(D[[i]]["T08:30/T23:59:59"], D[[i + 1]]["T00:00:00/T13:30:00"])
})

Редактировать: Выше можно расширить, добавив имена в список:

names(mts.days) <- as.Date(sapply(D, function(x) as.Date(start(x))))

Затем вы можете ссылаться на данные с 8:30 утра 2012-01-30 до 13:30 вечера 2012-01-31 вот так

mts.days[["2012-01-30"]]

В качестве альтернативы, если вы собираетесь вытащить только один «день», вы можете сделать что-то подобное (что следует той же базовой логике)

PullDay <- function(Date="2012-01-30", t0="08:30", t1="13:30", mts=mts) {
  string1 <- paste(Date, " ", t0, "/", Date, " 23:59:59", sep="")
  string2 <- paste(as.Date(Date) + 1, " 00:00:00/", as.Date(Date) + 1, " ", t1, sep="")
  rbind(mts[string1], mts[string2])
}

Затем PullDay("2012-01-30") предоставит вам подмножество данных за 2012-01-30 08: 30 / 2012-01-31 13: 30.

Edit2: Тоупрощается до

PullDay <- function(Date="2012-01-30", t0="08:30", t1="13:30", mts=mts) {
  mts[paste(Date, " ", t0, "/", as.Date(Date) + 1, " ", t1, sep="")]
}

, что заставляет меня поверить, что я все еще не понимаю, что вы хотите ...

0 голосов
/ 02 апреля 2013

Я сам искал ответ на этот вопрос.Ответ GSee идеален.Но поскольку не было предоставлено данных, я составил свои собственные.В процессе немного адаптирован код GSee.Для OP, пожалуйста, выберите ответ GSee, так как он отвечает на ваш вопрос.Приведенный ниже код предназначен для справки, если кому-то интересен этот вопрос (включая мою будущую самость):

Создайте объект xts, который начинается в 8:30 и заканчивается в 13:30 в течение 3-дневного периода:

ticks <- 24*60*10
mts <- xts( runif(ticks,0,1)
              , order.by = seq( as.POSIXct("2013-01-01 08:30:00")
                                , as.POSIXct("2013-01-03 13:30:00")
                                , length = ticks
                           ) 
         )


D <- split(mts, "days")
D[1]; D[2]; D[3];

Функция GSee для извлечения данных из объекта xts:

PullDay <- function(x, d0 = "2013-01-01", d1 = "2013-01-03", t0 = "08:30", t1 = "13:30") 
 {
   x[paste0(d0, " ", t0, "/", d1, " ", t1)]
 }

Для извлечения данных с 8:30 утра 2013-01-02 до 13:30 того же дня, сделайте:

PullDay(mts, d0="2013-01-02", d1="2013-01-02")

Чтобы указать точный диапазон, выполните:

PullDay(mts, d0="2013-01-02", d1="2013-01-02", t0="09:00", t1="09:01")

Если кто-то обнаружит ошибку, у вас есть разрешение на редактирование и исправление.

...