例如,如果我尝试每年获得endpoints
,请执行以下操作:
xts.data <- xts(1:10000, order.by=seq(from=as.Date("1970-01-01"), by=1, len=10000))
z <- endpoints(xts.data, on="months", k=12)
返回值为:
> z
[1] 0 10000
与高于12的数字相同。为什么xts
根本不会从一开始就返回每年或第13个月的指数。是否受到一年中某些时期的限制?那就是我做了:
z <- endpoints(xts.data, on="weeks", k=54)
这似乎工作正常。
答案 0 :(得分:2)
我同意这是一个错误,或者至少是一个需要记录的限制:k
for“months”仅适用于k = 1,2,3,4和6。
找到解决方法,我的第一个想法是:
library(xts)
x <- xts(1:10000, order.by=seq(from=as.Date("1970-01-01"), by=1, len=10000))
index(x)[endpoints(x, on="months", k=6)[c(T,F)]]
,并提供:
"1970-12-31" "1971-12-31" "1972-12-31"... "1995-12-31" "1996-12-31"
但是当我使用不同的数据集时它会中断:
x <- xts(1:10000, order.by=seq(from=as.Date("1970-07-01"), by=1, len=10000))
给出:
"1971-06-30" "1972-06-30" "1973-06-30" ...
稳定的答案是:
dates <- index(x)[endpoints(x, on="months", k=6)]
dates[ as.POSIXlt(dates)$mon==11 ]
(英文:获取每个半年的最后一天,并且只保留12月的那一天。)
另一种方法是只使用endpoints(x, on="years")
,然后删除最后一个日期,如果你不喜欢它。
我猜你想要一年的“最后一个交易日”或“最后一个样本日”,所以实际上每年都不会是12月31日。但如果你确实想要每年的特定日期:
index(x)[.indexmon(x)==11 & .indexmday(x)==31]
答案 1 :(得分:1)
是。这看起来像是一个实现问题。一旦我可以更完整地测试我正在使用的版本,我将为R-forge添加一个修复程序。
更新 两次
现在有一个关于R-forge的rev 742的补丁。它不太可能是最终的,但理想情况下这是方向。
> head(xts.data[z])
[,1]
1970-12-31 365
1971-12-31 730
1972-12-31 1096
1973-12-31 1461
1974-12-31 1826
1975-12-31 2191
> head(xts.data[endpoints(xts.data, on="months", k=1)])
[,1]
1970-01-31 31
1970-02-28 59
1970-03-31 90
1970-04-30 120
1970-05-31 151
1970-06-30 181
> head(xts.data[endpoints(xts.data, on="months", k=2)])
[,1]
1970-02-28 59
1970-04-30 120
1970-06-30 181
1970-08-31 243
1970-10-31 304
1970-12-31 365
> head(xts.data[endpoints(xts.data, on="months", k=3)])
[,1]
1970-03-31 90
1970-06-30 181
1970-09-30 273
1970-12-31 365
1971-03-31 455
1971-06-30 546
> head(xts.data[endpoints(xts.data, on="months", k=4)])
[,1]
1970-04-30 120
1970-08-31 243
1970-12-31 365
1971-04-30 485
1971-08-31 608
1971-12-31 730
> head(xts.data[endpoints(xts.data, on="months", k=6)])
[,1]
1970-06-30 181
1970-12-31 365
1971-06-30 546
1971-12-31 730
1972-06-30 912
1972-12-31 1096
> head(xts.data[endpoints(xts.data, on="months", k=7)])
[,1]
1970-07-31 212
1971-02-28 424
1971-09-30 638
1972-04-30 851
1972-11-30 1065
1973-06-30 1277