在另一个时间范围内返回数据子集时间范围?

时间:2012-08-08 19:15:46

标签: r time-series subset xts

有一些非常好的方法可以对xts个对象进行子集化。例如,人们可以获取所有年,月,日的所有数据,但严格来说是在上午9:30到下午4点之间:

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

或者您可以通过以下方式获得两个日期之间的所有观察结果:

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

或者在某个特定日期之前/之后的所有日期:

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

如何获取所有年份的特定月份或所有月份和年份的特定日期的所有数据?是否存在任何其他子集技巧?

3 个答案:

答案 0 :(得分:40)

您可以使用.index*系列函数来获取该月的特定月份或某些日期。有关功能的完整列表,请参阅?index。例如:

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

答案 1 :(得分:15)

时间子集有点隐藏,所以我理解为什么它会引发这样的问题。我知道的唯一“技巧”是lastfirst函数,如果需要,可以嵌套。例如这将是前3周的最后2天。

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

答案 2 :(得分:3)

请注意,对于Windows和ubuntu的yearmon日期格式的xts子集似乎有不同的行为。

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']

x2的结果在windows和ubuntu之间是一致的,因为格式是完整日期。但是,在将日期转换为yearmon之后,x3将为windows和ubuntu产生不同的结果。