Получение или подмножество первых 5 минут каждого дня данных из xts - PullRequest
3 голосов
/ 26 марта 2012

Я хотел бы выделить первые 5 минут данных временного ряда для каждого дня из подробных данных, однако первые 5 минут не появляются в одно и то же время каждый день, поэтому использование чего-то вроде xtsobj["T09:00/T09:05"] не будет работать, так как начало первых 5 минут изменений. то есть иногда это начинается в 9:20 утра или в другое случайное время утром вместо 9 утра.

До сих пор мне удавалось выделять первую минуту каждого дня, используя такую ​​функцию, как:

k <- diff(index(xtsobj))> 10000

xtsobj[c(1, which(k)+1)]

т.е. найти пробелы в данных, которые превышают 10000 секунд, но перейти от этого к поиску первых 5 минут каждого дня становится все труднее, поскольку данные не всегда распределяются равномерно. То есть между первой минутой и пятой минутой может быть от 2 до 5 строк, и, таким образом, использовать что-то вроде:

xtsobj[c(1, which(k)+6)]

и затем связывание результатов вместе

не всегда точен. Я надеялся, что можно использовать такую ​​функцию, как «first», но не знал, как это сделать в течение нескольких дней, возможно, это может быть оптимальным решением. Есть ли лучший способ получить эту информацию?

Большое спасибо заранее сообществу stackoverflow.

Ответы [ 2 ]

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

split(xtsobj, "days") создаст список с объектом xts для каждого дня.

Затем вы можете применить head к каждому дню

lapply(split(xtsobj, "days"), head, 5)

или, в более общем случае,

lapply(split(xtsobj, "days"), function(x) {
  x[1:5, ]
})

Наконец, вы можете rbind дни назад вместе, если хотите.

do.call(rbind, lapply(split(xtsobj, "days"), function(x) x[1:5, ]))
2 голосов
/ 26 марта 2012

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

Так было бы что-то вроде:

five_minutes_after = starting_point_each_day + minutes(5)

Затем вы можете использовать обычное подмножество xts, делая что-то вроде:

5_min_period = paste(starting_point_each_day,five_minutes_after,sep='/')

xtsobj[5_min_period]

Edit:

@ Joshua Я думаю, что это работает, посмотрите на этот пример:

library(lubridate)
x <- xts(cumsum(rnorm(20, 0, 0.1)), Sys.time() - seq(60,1200,60))

starting_point_each_day= index(x[1])
five_minutes_after = index(x[1]) + minutes(5)
five_min_period = paste(starting_point_each_day,five_minutes_after,sep='/')

x[five_min_period]

В моем предыдущем примере я допустил ошибку, поставил Five_min_period между кавычками. Это то, на что ты указывал, Джошуа? Также, возможно, отправная точка не нужна, просто:

until5min=paste('/',five_minutes_after,sep="")
x[until5min]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...