【问题标题】:R Subset XTS weekdaysR 子集 XTS 工作日
【发布时间】:2012-02-23 16:16:39
【问题描述】:

如何将 xts 对象子集化为仅包含工作日(周一至周五,周六和周日除外)?

【问题讨论】:

    标签: r xts


    【解决方案1】:

    这是我要做的:

    library(xts)
    data(sample_matrix)
    sample.xts <- as.xts(sample_matrix, descr='my new xts object')
    x <-  sample.xts['2007']  
    x[!weekdays(index(x)) %in% c("Saturday", "Sunday")]
    

    编辑: cmets 中的 Joshua Ulrich 指出了使用 .indexwday() 的更好解决方案,这是用于提取 xts 类对象索引片段的内置访问器函数家族之一。此外,与 Dirk Eddelbuettel 的解决方案一样,以下内容应该与语言环境无关:

    x[.indexwday(x) %in% 1:5]
    

    【讨论】:

    • 我给出了基本相同的答案,但依赖于数字工作日,这使得它独立于使用的语言环境。
    • +1 注意这里有.indexwday 函数,所以你的最后一行也可以是:x[.indexwday(x) %in% 1:5]
    • @DirkEddelbuettel 感谢您指出这一点(以及 +1 chez vous)。否则我不会欣赏这种差异。
    • @JoshO'Brien:好吧,我碰巧读过help(weekdays) 页面,因为weekdays 没有给出数字结果让我再次恼火。
    • 不,它没有改变。尽管 CRAN 上的 xts 版本存在错误(转换中未使用时区)。这可能是建议的修改中出现问题的原因。
    【解决方案2】:

    通过计算给定日期和子集的星期几。在示例中,我使用 Date 类型,但转换为 POSIXlt 的方式与 POSIXct 日内时间戳相同。

    > mydates <- Sys.Date() + 0:6
    > mydates
    [1] "2012-01-31" "2012-02-01" "2012-02-02" "2012-02-03" "2012-02-04" 
    +   "2012-02-05" "2012-02-06"
    > we <- sapply(mydates, function(d) { as.POSIXlt(d)$wday}) %in% c(0, 6)
    > we
    [1] FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE
    > mydates[ ! we ]
    [1] "2012-01-31" "2012-02-01" "2012-02-02" "2012-02-03" "2012-02-06"
    > 
    

    这真的不是xts 的问题,而是基本的日期处理。

    【讨论】:

      猜你喜欢
      • 2015-12-01
      • 1970-01-01
      • 2016-09-13
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 2014-07-16
      • 1970-01-01
      • 2014-03-09
      相关资源
      最近更新 更多