48
votes

There are very nifty ways of subsetting xts objects. For example, one can get all the data for all years, months, days but being strictly between 9:30 AM and 4 PM by doing:

my_xts["T09:30/T16:00"]

Or you can get all the observations between two dates by doing:

my_xts["2012-01-01/2012-03-31"]

Or all the dates before/after a certain date by doing:

my_xts["/2011"]  # from start of data until end of 2011
my_xts["2011/"]  # from 2011 until the end of the data

How can I get all the data for only certain months for all years or only certain days for all months and years? Do any other subsetting tricks exist?

3
Have you seen quantmod.com? Specifically, the examples quantmod.com/examples/data - GSee
Here is how to invert a subset, using which.i: stackoverflow.com/a/32029644/841830 - Darren Cook
For one year dt['2009',], filtering year and month dt[':2009-01',] and using a date range: dt['2009-01-01::2009-02-01']. - marbel

3 Answers

40
votes

You can use the .index* family of functions to get certain months or certain days of the month. See ?index for the full list of functions. For example:

library(quantmod)
getSymbols("SPY")
SPY[.indexmon(SPY)==0]   # January for all years (note zero-based indexing!)
SPY[.indexmday(SPY)==1]  # The first of every month
SPY[.indexwday(SPY)==1]  # All Mondays
15
votes

time-of-day subsetting is a little bit hidden, so I understand why it would spark a question like this. The only other 'trick' I know is the last and first functions, which you can nest if you need to. e.g. this will get the last 2 days of the first 3 weeks.

last(first(my_xts, "3 weeks"), "2 days")
3
votes

Be aware that there appears to be different behavior for xts subsetting of a yearmon date format for windows and ubuntu.

library(quantmod)
library(xts)

getSymbols("SPY", src="google", from = "2004-01-01")
x1 <- SPY['2006-01/2007-12']

x2 <- apply.monthly(x1,mean)
x2['2006-01/2007-12']

x3 <- as.xts(coredata(x2),order.by = as.yearmon(index(x2)))
x3['2006-01/2007-12']

The result for x2 is consistent between windows and ubuntu, since the format is full date. However, the x3 will produce different result for windows and ubuntu, after the conversion of the dates to yearmon.