xts中的端点(bug?)行为

时间:2012-11-09 23:32:13

标签: r xts

例如,如果我尝试每年获得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)

这似乎工作正常。

2 个答案:

答案 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