подмножество в xts с использованием даты хранения параметра

Я знаком с возможностями подмножества xts. Однако я не могу найти элегантного способа подмножества параметризованного диапазона дат. что-то вроде этого:

times = c(as.POSIXct("2012-11-03 09:45:00 IST"),
          as.POSIXct("2012-11-05 09:45:00 IST"))

#create an xts object:
xts.obj = xts(c(1,2),order.by = times)

#filter with these dates:
start.date = as.POSIXct("2012-11-03")
end.date = as.POSIXct("2012-11-04")

#instead of xts["2012-11-03"/"2012-11-04"], do something like this:
xts[start.date:end.date]

У кого-нибудь есть идеи? Спасибо!


person zuuz    schedule 31.12.2012    source источник


Ответы (4)


Вы можете вставить объекты start.date и end.date вместе, разделив их "::" или "/", а затем использовать это для подмножества.

R> xts.obj[paste(start.date,end.date,sep="::")]
                    [,1]
2012-11-03 09:45:00    1
person Joshua Ulrich    schedule 31.12.2012
comment
Я не решаюсь указать это, но когда я прочитал справку, я подумал, что более эффективно указывать индекс на основе времени. не так ли? - person agstudy; 31.12.2012
comment
@Джошуа: большое спасибо! [хотя, как вы выразились, это вдруг выглядит тривиально :-)...] - person zuuz; 31.12.2012
comment
@agstudy: подмножество символов в стиле ISO по диапазону (т. е. вектор длины 1, содержащий : или /) выполняется очень быстро. Это медленно, если вы подмножествуете символ в стиле ISO vector. - person Joshua Ulrich; 31.12.2012
comment
@JoshuaUlrich: на самом деле, если ваш end.date = as.POSIXct(2012-11-05) [вместо 2012-11-04], то использование sep=: возвращает только 1-й элемент. Вам действительно нужен sep=/. Должен ли я отредактировать ваш ответ? - person zuuz; 31.12.2012
comment
@zorbar: упс, это должно было быть ::. - person Joshua Ulrich; 31.12.2012

с помощью [.xts {xts}

Поскольку xts использует представления времени POSIXct для всех классов индексов пользовательского уровня внутри, самое быстрое подмножество timeBased всегда будет из объектов POSIXct, независимо от indexClass исходного объекта.

Таким образом, вы можете сделать подмножество timeBased следующим образом:

xts.obj[seq(start.date,end.date,by=60)]
                    [,1]
2012-11-03 09:45:00    1
person agstudy    schedule 31.12.2012
comment
Спасибо за ответ. однако start.date и end.date являются объектами POSIXct. таким образом, последовательность, как вы пишете, дала мне последовательность с шагом в 1 секунду. Итак, я использовал его как xts.obj[seq(as.Date(start.date),as.Date(end.date),by=1)], но он дает мне пустой список... - person zuuz; 31.12.2012

Для тех, кто ломает голову, чтобы сделать это для не Posix. Особенно для квартальных данных, т. е. со второго квартала 2001 г. по третий квартал 2006 г.

Я использовал простое, но элегантное решение:

library(xts)

starting.quarter<-"200101"
ending.quarter<-"201702"

oil_price_by_qtr<-oil_price_by_qtr[paste(starting.quarter,ending.quarter,sep="/")]

И это подмножит объект XTS с 1 квартала 2001 года по 2 квартал 2017 года.

Пусть это поможет какому-нибудь другому бедолаге не потерять 2 часа своей жизни.

person NonReformed Bayesianist    schedule 15.05.2017

Мне просто нужно было сделать то же самое. Вот мое решение, основанное на исходном примере.

library(xts)

times = c(as.POSIXct("2012-11-03 09:45:00 IST"),
          as.POSIXct("2012-11-05 09:45:00 IST"))

#create an xts object:
xts.obj = xts(c(1,2),order.by = times)

#filter with these dates:
start.date = as.POSIXct("2012-11-03")
end.date = as.POSIXct("2012-11-04")

# By using an index that is the logical AND of two vectors
xts.obj[start.date <= index(xts.obj) & index(xts.obj) <= end.date]
person Paul Hudson    schedule 14.12.2015