在XTS中分裂的艰难时期

时间:2018-08-18 11:27:48

标签: r xts

先生。 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: 在最终了解端点和拆分应该如何工作之后,将我的答案发布在下面...

1 个答案:

答案 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库的所有误解中最好的部分是?我现在知道如何处理函数中的省略号(...)和子函数的调用!