先生。 Ulrichs xts软件包总是非常出色。我一直在使用普通5分钟,15分钟,30分钟的拆分时间。没问题。
现在我被卡住了。
#Setup test data
my.time <- seq(from = as.POSIXct('2000-01-01 00:00:00'),
to = as.POSIXct('2000-01-01 1:00:00'),
by = '1 sec')
my.data <- rep(10, length = length(my.time))
my.xts <- as.xts(my.data, order.by = my.time)
#Now splitting and checking endtimes of first split
tail((split(my.xts, f="minutes", k=20))[[1]])
tail((split(my.xts, f="minutes", k=30))[[1]])
#2000-01-01 00:19:59 10 #All good
#2000-01-01 00:29:59 10 #All good
tail((split(my.xts, f="minutes", k=22))[[1]])
#2000-01-01 00:11:59 10 #Hmmm, what am I missing. Expectimg 00:21:59
#As endpoints is used by split I also checked this behaviour
endpoints(my.xts, on="minutes", k=20)
#[1] 0 1200 2400 3600 3601 #All good
endpoints(my.xts, on="minutes", k=30)
#[1] 0 1800 3600 3601 #All good
endpoints(my.xts, on="minutes", k=22)
#[1] 0 720 2040 3360 3601 #Hmmm
为了理解这一点,我在https://github.com/joshuaulrich/xts/blob/master/src/endpoints.c
处进一步研究了XTS代码。我发现这应该更有效
c(0,which(diff(_x%/%on%/%k+1) != 0),NROW(_x))
所以我尝试了
which(diff(.index(my.xts) %/% 60 %/% 20 +1) != 0)
#[1] 1200 2400 3600 #As expected
which(diff(.index(my.xts) %/% 60 %/% 21 +1) != 0)
#[1] 1080 2340 3600 #Expecting 1260 2520...
which(diff(.index(my.xts) %/% 60 %/% 22 +1) != 0)
#[1] 720 2040 3360 #Expecting 1320 2640...
which(diff(.index(my.xts) %/% 60 %/% 23 +1) != 0)
#[1] 720 2100 3480 #Expecting 1380 2760...
which(diff(.index(my.xts) %/% 60 %/% 24 +1) != 0)
#[1] 1440 2880 #As expected
which(diff(.index(my.xts) %/% 60 %/% 30 +1) != 0)
#[1] 1800 3600 #As expected
这是我的大脑过热的地方,我改为在这里张贴。我敢肯定我只是缺少一些东西,所以我没有在Github上将其发布为错误。请帮助解释发生了什么。为什么我没有得到预期的结果?
编辑: 因此,快速思考一下,我想这与所有功能都基于Unix时间的开始以及使用不能被一小时整除的时基有关。这是我理解的正确线索吗?
EDIT2: 在最终了解端点和拆分应该如何工作之后,将我的答案发布在下面...
答案 0 :(得分:1)
当然,split
(和endpoints
)可以在xts中正常工作。即确定间隔时,以1970-01-01 00:00:00为起点进行拆分。
是的,我误用了分割,因为它是在时间序列xts数据中的一个小时的任意起始点分割的一种简便方法。
无论如何,我编写了这个简短的函数来解决我的小问题,该函数“重置”了第一个时间戳到1970-01-01 00:00:00。
## contuation from code snippet above
#So, I realised it was all about resetting the first time
#to 1970-01-01 00:00:0,
#so that I could do easily my "strange" splitting.
#Please note that this is not to be used for dates,
#only when working on hour, mins or secs
#and don't care that you break the index.
startMovedSplit <- function(x, ...) {
startIndex <- head(.index(x), n=1)
.index(x) <- .index(x) - startIndex
split(x, ...)
}
#New Try
tail((startMovedSplit(my.xts, f="minutes", k=20))[[1]])
tail((startMovedSplit(my.xts, f="minutes", k=30))[[1]])
#1970-01-01 00:19:59 10 #Good enough for my purposes
#1970-01-01 00:29:59 10 #Good enough for my purposes
tail((startMovedSplit(my.xts, f="minutes", k=22))[[1]])
#1970-01-01 00:21:59 10 #Good enough for my purposes
我对xts库的所有误解中最好的部分是?我现在知道如何处理函数中的省略号(...)
和子函数的调用!