【问题标题】:Set day of week to be used by to.weekly设置 to.weekly 使用的星期几
【发布时间】:2012-01-07 10:20:37
【问题描述】:

我正在尝试将 xts 对象中包含的每日数据时间序列(仅工作日)转换为每周数据的时间序列。具体来说,我希望生成的时间序列包含原始数据的周末条目(即一周的最后一个工作日)。我一直在尝试使用 xts 包的 to.weekly 函数来实现这一点。

在关于另一个问题 (Wrong week-ending date using 'to.weekly' function in 'xts' package) 的讨论中,下面的示例代码完全符合我的需要。但是,当我运行代码时,to.weekly 使用 Mondays 作为每周数据的代表。

我想知道哪种全局设置可以让我强制 to.weekly 使用 Friday 作为一周的代表。

示例代码:

library(lubridate); library(xts)   
test.dates <- seq(as.Date("2000-01-01"),as.Date("2011-10-01"),by='days')
test.dates <- test.dates[wday(test.dates)!=1 & wday(test.dates)!=7] #Remove weekends
test.data <- rnorm(length(test.dates),mean=1,sd=2)
test.xts <- xts(x=test.data,order.by=test.dates)
test.weekly <- to.weekly(test.xts)
test.weekly[wday(test.weekly, label = TRUE, abbr = TRUE) != "Fri"]

【问题讨论】:

    标签: r time-series xts group-by


    【解决方案1】:
    test.dates <- test.dates[wday(test.dates)==6]
    tail(wday(test.dates, label = TRUE, abbr = TRUE))
    #[1] Fri Fri Fri Fri Fri Fri
    #Levels: Sun < Mon < Tues < Wed < Thurs < Fri < Sat
    

    好的。将未说明的要求添加到问题中:

    require(timeDate)
    require(lubridate)
     startDate <- as.Date("2000-01-03")
     endDate <- as.Date("2011-10-01")
     AllDays <- as.timeDate(seq(startDate, endDate, by="day"))
     is.wrk <- isBizday(AllDays, holidays = holidayNYSE(), wday = 1:5)
     is.wrkdt <- as.Date(names(is.wrk)[is.wrk])
     endweeks <- tapply(is.wrkdt, paste(year(is.wrkdt),week(is.wrkdt), sep = ""), max)
     head(as.Date(endweeks, origin="1970-01-01"))
    #           1            2            3            4            5            6 
    #"2011-01-06" "2011-01-13" "2011-01-20" "2011-01-27" "2011-02-03" "2011-02-10" 
    

    所以你想要:

     as.Date(endweeks, origin="1970-01-01")
    

    【讨论】:

    • 感谢@DWin。我曾想过这个解决方案。但是,我需要一个能够处理假期并最好选择前一个工作日作为一周代表的解决方案。我可以编写一些自定义代码,但希望有一些实现的功能可以做到这一点。
    • 我在xtslubridate 中找不到假日定义函数。 (我认为 xts 会这样做,因为我的记忆告诉我它定义了“金融中心”的时间。) 'chron' 包有一些人们可能认为可以解决问题的东西,但它只为 1992 年定义。
    • 对不起,发现一个错误:endweeks &lt;- tapply(is.wrkdt, week(is.wrkdt), max) 会失败,如果数据超过一年。我猜你需要创建一个不同的索引,比如 yyyyww。
    • 使用 endweeks &lt;- tapply(is.wrkdt, paste(year(is.wrkdt),week(is.wrkdt), sep = ""), max) 对我来说很好。
    【解决方案2】:

    我遇到了同样的问题,我找到了一个两行解决方案。

    您首先需要只保留工作日(如果您的数据集还包含节假日):

    test.dates <- test.dates[ wday(dates) %in% c(2:6) ]
    

    那么你有两个选择。首先,您可以使用 to.weekly() 保留最近的工作日,即不一定限于 wday(test.dates)==6

    test.weekly <- to.weekly(test.xts)
    

    或者您可以使用函数 endpoints(),它适用于多列 xts 对象并更好地处理 NA,因为它不会删除丢失的数据(防止警告 “从数据中删除的缺失值”)

    test.weekly <- test.xts[endpoints(test.xts,on='weeks')[-1],]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-31
      • 2013-01-09
      • 1970-01-01
      • 2013-07-27
      相关资源
      最近更新 更多