设置由to.weekly使用的星期几

时间:2011-11-27 18:00:24

标签: r time-series xts group-by

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

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

我想知道哪个全球设置可能允许我强制使用星期五作为一周的代表。

示例代码:

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"]

2 个答案:

答案 0 :(得分:0)

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")

答案 1 :(得分:0)

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

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

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

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

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

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

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