Нахождение самого последнего наблюдения раньше, чем определенная отметка времени с XTS - PullRequest
5 голосов
/ 18 ноября 2011

У меня есть xts объект, который выглядит следующим образом:

> q.xts
                                  val
2011-08-31 09:30:00.002357 -1.0135222
2011-08-31 09:30:00.003443 -0.2182679
2011-08-31 09:30:00.005075 -0.5317191
2011-08-31 09:30:00.009515 -1.0639535
2011-08-31 09:30:00.011569 -1.2470759
2011-08-31 09:30:00.012144  0.7678103
2011-08-31 09:30:00.023813 -0.6303432
2011-08-31 09:30:00.024107 -0.5105943

Я вычисляю фиксированное смещение из отметок времени в другом кадре данных, r.Количество строк в r значительно меньше количества строк в q.xts.

> r
                        time               predict.time
1 2011-08-31 09:30:00.003443 2011-08-31 09:30:00.002443
2 2011-08-31 09:30:00.009515 2011-08-31 09:30:00.008515
3 2011-08-31 09:30:00.024107 2011-08-31 09:30:00.023108

Столбец time соответствует наблюдению от q.xts, тогда как столбец predict.timeНа 1 миллисекунду раньше, чем time (за вычетом округления)*.Для трех наблюдений в r выше я бы ожидал следующих совпадений:

                        time               predict.time     (time from q.xts)
1 2011-08-31 09:30:00.003443 2011-08-31 09:30:00.002443  --> 09:30:00.002357
2 2011-08-31 09:30:00.009515 2011-08-31 09:30:00.008515  --> 09:30:00.005075
3 2011-08-31 09:30:00.024107 2011-08-31 09:30:00.023108  --> 09:30:00.012144

Я подошел к этому, перебрав каждую строку в r и выполнив xts subset.Итак, для строки 1 из r я бы сделал:

> last(index(q.xts[paste('/', r[1,]$predict.time, sep='')]))
[1] "2011-08-31 09:30:00.002357 CDT"

ВОПРОС: Делать это с помощью цикла кажется неуклюжим и неловким.Есть ли способ лучше?Я хотел бы закончить с другим столбцом в r, который предоставляет точное время или номер строки для соответствующего значения в q.xts.


ПРИМЕЧАНИЕ: Используйте это длясоздайте данные, которые я использовал для этого примера:

q <- read.csv(tc <- textConnection("
       2011-08-31 09:30:00.002358, -1.01352216
       2011-08-31 09:30:00.003443, -0.21826793
       2011-08-31 09:30:00.005076, -0.53171913
       2011-08-31 09:30:00.009515, -1.06395353
       2011-08-31 09:30:00.011570, -1.24707591
       2011-08-31 09:30:00.012144,  0.76781028
       2011-08-31 09:30:00.023814, -0.63034317
       2011-08-31 09:30:00.024108, -0.51059425"),
     header=FALSE); close(tc)
colnames(q) <- c('datetime', 'val')
q.xts <- xts(q[-1], as.POSIXct(q$datetime))

r <- read.csv(tc <- textConnection("
       2011-08-31 09:30:00.003443
       2011-08-31 09:30:00.009515
       2011-08-31 09:30:00.024108"),
     header=FALSE); close(tc)
colnames(r) <- c('time')
r$time <- as.POSIXct(strptime(r$time, '%Y-%m-%d %H:%M:%OS'))
r$predict.time <- r$time - 0.001

Ответы [ 2 ]

4 голосов
/ 18 ноября 2011

Возможно, есть лучший способ сделать это, но это лучшее, что я могу придумать на данный момент.

# create an empty xts object based on r$predict.time
r.xts <- xts(,r$predict.time)
# merge q.xts and r.xts. This will insert NAs at the times in r.xts.
tmp <- merge(q.xts,r.xts)
# Here's the magic:
# lag tmp *backwards* one period, so the NAs appear at the times
# right before the times in r.xts. Then grab the index for the NA periods
tmp.index <- index(tmp[is.na(lag(tmp,-1,na.pad=FALSE))])
# get the rows in q.xts for the times in tmp.index
out <- q.xts[tmp.index]
#                                   val
# 2011-08-31 09:30:00.002357 -1.0135222
# 2011-08-31 09:30:00.005075 -0.5317191
# 2011-08-31 09:30:00.012144  0.7678103
2 голосов
/ 19 марта 2014

Я бы использовал findInterval:

findInterval(r$predict.time, index(q.xts))

> q.xts[findInterval(r$predict.time, index(q.xts)),]
                           val
2011-08-31 09:30:00 -1.0135222
2011-08-31 09:30:00 -0.5317191
2011-08-31 09:30:00  0.7678103

Ваши времена POSIXct, так что это должно быть довольно надежным.

...