Fecha de fin de semana incorrecta utilizando la función 'Weekly' en el paquete 'XTS'
Pregunta
Tengo un problema realmente extraño ... estoy usando el to.weekly
y to.period
función para convertir un diario xts
OBJETO A DATOS SEMANALES. En la mayoría de los casos, obtengo la fecha de finalización de la semana como viernes (day.of.week
la función devolverá 5) (por ejemplo "2010-01-08"
, "2011-02-11"
), pero hay algunos casos en los que obtengo algo más que el viernes (sábado/domingo/jueves/etc.)
Yo he tratado to.weekly
y to.period(x, period = 'weeks')
y ambos devuelven el mismo problema.
¿Por qué está pasando esto? ¿¿Hay una solución para esto??
¡¡Gracias!!
Editar: ejemplo a continuación
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)}
Esto devuelve las fecha (s) que no son viernes: time(to.weekly(test.xts))[dayofweek(time(to.weekly(test.xts))) != 5]
Solución
Tiene 2 problemas con su ejemplo:
- Su
dayofweek
La función es un poco engorrosa y probablemente es incorrecta en sus resultados. - Le faltan fechas de ejemplo, como el 23-23-2010.
Aquí hay una versión limpia de su código:
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"]
El único resultado de esta función es
test.xts.Open test.xts.High test.xts.Low test.xts.Close
2010-05-22 -1.705749 1.273982 -2.084203 -1.502611
El problema, por supuesto, es que esta semana termina en 05-23-2010
, pero esa fecha no está presente en las series de tiempo. Por lo tanto, to.weekly
usa la siguiente fecha más cercana como el punto final, que es 05-22-2010
. Esta es la fuente de su problema.
Aquí hay un mejor ejemplo, que no revela ningún problema con el to.weekly
función.
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"]