R -XTS按周功能分开,将一周的第一天指定为周日,而不是星期一的违约



split函数应用于xts对象,将weeks组排入每周的块中。组的默认日为MondaySunday。如果我希望小组的日子从SundaySaturday,该怎么办?

library(xts)
idx <- as.Date("2018-3-1") + 0:14
v <- 1:15
x <- xts(v, idx)
group <- split(x, f = 'weeks')
group
Output:
[[1]]
           [,1]
2018-03-01    1  # Thursday
2018-03-02    2  # Friday
2018-03-03    3  # Saturday
2018-03-04    4  # Sunday
[[2]]
           [,1]
2018-03-05    5  # Monday
2018-03-06    6  # Tuesday
2018-03-07    7  # Wednesday
2018-03-08    8  # Thursday
2018-03-09    9  # Friday
2018-03-10   10  # Saturday
2018-03-11   11  # Sunday
[[3]]
           [,1]
2018-03-12   12  # Monday
2018-03-13   13  # Tuesday
2018-03-14   14  # Wednesday
2018-03-15   15  # Thursday
Desired Output:
[[1]]
           [,1]
2018-03-01    1  # Thursday
2018-03-02    2  # Friday
2018-03-03    3  # Saturday
[[2]]
           [,1]
2018-03-04    4  # Sunday
2018-03-05    5  # Monday
2018-03-06    6  # Tuesday
2018-03-07    7  # Wednesday
2018-03-08    8  # Thursday
2018-03-09    9  # Friday
2018-03-10   10  # Saturday
[[3]]
           [,1]
2018-03-11   11  # Sunday
2018-03-12   12  # Monday
2018-03-13   13  # Tuesday
2018-03-14   14  # Wednesday
2018-03-15   15  # Thursday

我在星期日而不是星期一经常划分数周,因为我使用FX数据(市场在周日下午在纽约美国东部时间开放(。这是一个有效的解决方案split_FXweeks,使用分配时间序列数据的" XTS方式"。当您长时间使用高密度tick数据时,这种方法非常快。

此技巧的信用归因于以下链接中的技巧1:http://darrendev.blogspot.com.au/2012/08/small-rxts-code-snippets-snippets-and-tips.html

与其他建议的方法相比,添加了一个基准。

idx <- as.Date("2018-3-1") + 0:14
v <- 1:15
x <- xts(v, idx)

split_FXweeks <- function(x) {
  ep <- .Call("endpoints", .index(x) + 4L * 86400L, 604800L, 
              1, TRUE, PACKAGE = "xts")
  sp <- (ep + 1)[-length(ep)]
  ep <- ep[-1]
  lapply(1:length(ep), function(X) x[sp[X]:ep[X]])
}

split1 <- function(idx, x) {
  week_num <- format(idx, "%U")
  group <- unname(split(x, f = week_num))
  group
}
library(microbenchmark)
microbenchmark(
  y <- split_FXweeks(x),
  z <- split1(idx, x))
# Unit: microseconds
# expr     min      lq      mean   median       uq     max neval
# y <- split_FXweeks(x)  52.521  60.167  72.90766  75.2390  80.6495 162.077   100
# z <- split1(idx, x) 325.681 351.658 383.13293 364.2215 384.9765 881.486   100
# > y
# [[1]]
# [,1]
# 2018-03-01    1
# 2018-03-02    2
# 2018-03-03    3
# 
# [[2]]
# [,1]
# 2018-03-04    4
# 2018-03-05    5
# 2018-03-06    6
# 2018-03-07    7
# 2018-03-08    8
# 2018-03-09    9
# 2018-03-10   10
# 
# [[3]]
# [,1]
# 2018-03-11   11
# 2018-03-12   12
# 2018-03-13   13
# 2018-03-14   14
# 2018-03-15   15

考虑创建一个周数的外部,相等长度的向量%U格式从周日开始。参见?strftime

%u

一年中的一周作为十进制数字(00-53(,使用星期日作为第一个 本周的第1天(通常是一年的第一个星期日 第1周的第1天(。美国大会。

week_num <- format(idx, "%U")
group <- unname(split(x, f = week_num))
group
[[1]]
2018-03-01 1
2018-03-02 2
2018-03-03 3
[[2]]
2018-03-04  4
2018-03-05  5
2018-03-06  6
2018-03-07  7
2018-03-08  8
2018-03-09  9
2018-03-10 10
[[3]]
2018-03-11 11
2018-03-12 12
2018-03-13 13
2018-03-14 14
2018-03-15 15

相关内容

最新更新