2

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

这似乎工作正常。

4

2 回答 2

2

我同意这是一个错误,或者至少是一个需要记录的限制:kfor "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]
于 2012-11-11T02:26:47.430 回答
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
于 2012-11-11T04:34:02.980 回答