按周分割的xts将星期的第一天指定为星期日,而不是默认的星期一

les*_*l0l 5 split r time-series xts

运用split函数的xts对象由weeks行分组放入每周块.该组中的默认的日子MondaySunday.如果我希望小组中的日子来自Sunday,我该怎么办Saturday

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
Run Code Online (Sandbox Code Playgroud)

FXQ*_*der 5

我在星期日而不是星期一频繁地分开几周,因为我使用外汇数据(市场在周日下午纽约美国东部时间开放).这是一个有效的解决方案,split_FXweeks使用分割时间序列数据的"xts方式".当您长时间处理高密度刻度数据时,这种方法非常快.

这个技巧归功于下面链接中的技巧1(你可能会觉得很有帮助,就像我多年前学习R/xts时那样):http: //darrendev.blogspot.com.au/2012/ 08 /小rxts-代码片段和- 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
Run Code Online (Sandbox Code Playgroud)


Par*_*ait 3

考虑创建一个外部等长周数向量,其%U格式为从星期日开始的工作日。看?strftime

\n\n
\n

%U

\n\n

一年中的第几周,以十进制数表示 (00\xe2\x80\x9353),使用星期日作为一周的第一天(通常将一年中的第一个星期日作为第一周的第一天)。美国大会。

\n
\n\n
week_num <- format(idx, "%U")\ngroup <- unname(split(x, f = week_num))\ngroup\n\n[[1]]\n\n2018-03-01 1\n2018-03-02 2\n2018-03-03 3\n\n[[2]]\n\n2018-03-04  4\n2018-03-05  5\n2018-03-06  6\n2018-03-07  7\n2018-03-08  8\n2018-03-09  9\n2018-03-10 10\n\n[[3]]\n\n2018-03-11 11\n2018-03-12 12\n2018-03-13 13\n2018-03-14 14\n2018-03-15 15\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这种方法将分割对象转换为纯粹的“zoo”,丢失了“xts”类。即“lapply(组,类)”。这可能是不希望的。 (3认同)