使用“xts"包中的“to.weekly"函数错误的周结束日期 [英] Wrong week-ending date using 'to.weekly' function in 'xts' package
问题描述
我有一个非常奇怪的问题...我正在使用 to.weekly
和 to.period
函数来转换每日 xts
反对每周数据.在大多数情况下,我将周结束日期设为星期五(day.of.week
函数将返回 5)(例如 "2010-01-08"
, <代码>2011-02-11"),但在某些情况下,我会收到周五以外的其他信息(周六/周日/周四/等)
I have a really odd issue... I am using the to.weekly
and to.period
function to convert a daily xts
object to weekly data. In most instances, I get the week-ending date as a Friday (day.of.week
function will return 5) (e.g. "2010-01-08"
, "2011-02-11"
), but there are a few cases where I get something other than Friday (Saturday/Sunday/Thursday/etc.)
我尝试过 to.weekly
和 to.period(x, period = 'weeks')
并且都返回相同的问题.
I have tried to.weekly
and to.period(x, period = 'weeks')
and both return the same problem.
为什么会这样?有没有解决方法?
Why is this happening? Is there a work-around for this??
谢谢!!
test.dates <- as.Date(c("2010-04-27","2010-04-28","2010-04-29","2010-04-30","2010-05-03","2010-05-04","2010-05-05","2010-05-06","2010-05-07","2010-05-10","2010-05-11","2010-05-12","2010-05-13","2010-05-14","2010-05-17","2010-05-18","2010-05-19","2010-05-20","2010-05-21","2010-05-22","2010-05-24","2010-05-25","2010-05-26","2010-05-27","2010-05-28","2010-06-01","2010-06-02","2010-06-03","2010-06-04"))
test.data <- rnorm(length(test.dates),mean=1,sd=2)
test.xts <- xts(x=test.data,order.by=test.dates)
#Function that takes in a vector of zoo/xts objects (e.g. "2010-01-08") and returns the day of the week for each
dayofweek <- function(x) {
placeholder <- vector("list",length=length(x))
names(placeholder) <- x
for(i in 1:length(x)) {placeholder[[i]] <- month.day.year(x[i])}
placeholder2 <- rep(NA,times=length(x))
for(i in 1:length(x)) {placeholder2[i] <- day.of.week(placeholder[[i]][[1]],placeholder[[i]][[2]],placeholder[[i]][[3]])}
return(placeholder2)}
这将返回非星期五的日期:time(to.weekly(test.xts))[dayofweek(time(to.weekly(test.xts))) != 5]代码>
This returns the date(s) that are not Friday: time(to.weekly(test.xts))[dayofweek(time(to.weekly(test.xts))) != 5]
推荐答案
你的例子有两个问题:
- 您的
dayofweek
函数有点麻烦,而且结果可能不正确. - 您的示例日期缺少一些日期,例如 05-23-2010.
- Your
dayofweek
function is a bit cumbersome, and probably incorrect in its results. - Your example dates is missing some dates, such as 05-23-2010.
这是您的代码的清理版本:
Here is a cleaned-up version of your code:
library(xts)
test.dates <- as.Date(c("2010-04-27","2010-04-28","2010-04-29","2010-04-30","2010-05-03","2010-05-04","2010-05-05","2010-05-06","2010-05-07","2010-05-10","2010-05-11","2010-05-12","2010-05-13","2010-05-14","2010-05-17","2010-05-18","2010-05-19","2010-05-20","2010-05-21","2010-05-22","2010-05-24","2010-05-25","2010-05-26","2010-05-27","2010-05-28","2010-06-01","2010-06-02","2010-06-03","2010-06-04"))
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)
library(lubridate)
test.weekly[wday(test.weekly, label = TRUE, abbr = TRUE) != "Fri"]
这个函数的唯一结果是
test.xts.Open test.xts.High test.xts.Low test.xts.Close
2010-05-22 -1.705749 1.273982 -2.084203 -1.502611
当然,问题是本周结束于 05-23-2010
,但该日期不在时间序列中.因此,to.weekly
使用下一个最近的日期作为结束点,即 05-22-2010
.这是您问题的根源.
The problem of course, is that this week ends on 05-23-2010
, but that date is not present in the time series. Therefore, to.weekly
uses the next closest date as the end point, which is 05-22-2010
. This is the source of your problem.
这是一个更好的例子,它表明 to.weekly
函数没有问题.
Here is a better example, which reveals no issue with the to.weekly
function.
library(lubridate); library(xts)
test.dates <- seq(as.Date("1900-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"]
这篇关于使用“xts"包中的“to.weekly"函数错误的周结束日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!