【问题标题】:xts split by week function specify first day of week as Sunday instead of default of Mondayxts 按周拆分函数将一周的第一天指定为星期日,而不是默认的星期一
【发布时间】:2018-04-01 23:07:47
【问题描述】:

通过weekssplit 函数应用于xts 对象,将行分组为每周块。组中的默认日期为 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

【问题讨论】:

    标签: r split time-series xts


    【解决方案1】:

    我经常在周日而不是周一按周划分,因为我处理的是外汇数据(市场在纽约东部标准时间周日下午开市)。这是一个有效的解决方案,split_FXweeks,使用拆分时间序列数据的“xts 方式”。当您长时间处理高密度的刻度数据时,这种方法非常快。

    此技巧的功劳归功于以下链接中的技巧 1:http://darrendev.blogspot.com.au/2012/08/small-rxts-code-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
    

    【讨论】:

      【解决方案2】:

      考虑为从星期日开始的工作日创建一个具有%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
      

      【讨论】:

      • 这种方法将拆分对象转换为纯粹的zoo,失去xts 类。即lapply(group, class)。这可能是不可取的。
      猜你喜欢
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 2013-06-05
      • 2012-11-27
      • 1970-01-01
      • 2019-10-08
      • 1970-01-01
      相关资源
      最近更新 更多