подмножество в 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
@Joshua: благодаря много! [въпреки че начинът, по който го изразявате, изведнъж изглежда тривиален :-)...] - person zuuz; 31.12.2012
comment
@agstudy: Подмножеството на знаци в стил ISO по диапазон (т.е. вектор с дължина 1, съдържащ : или /) е много бързо. Това е бавно, ако подмножествате със знак в стил ISO вектор. - person Joshua Ulrich; 31.12.2012
comment
@JoshuaUlrich: всъщност, ако вашата end.date = as.POSIXct(2012-11-05) [вместо 2012-11-4], тогава използването на sep=: връща само първия елемент. Всъщност имате нужда от 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 Q2 до 2006 Q3.

Използвах просто, но елегантно решение:

library(xts)

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

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

И това ще подмножества XTS обекта от 2001 Q1 до 2017 Q2.

Нека това помогне на някоя друга бедна душа да избегне загубата на 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