Date de fin de semaine incorrecte en utilisant la fonction 'to.weekly' dans le package 'xts'
Question
J'ai un problème vraiment étrange ... J'utilise les fonctions to.weekly
et to.period
pour convertir un objet xts
quotidien en données hebdomadaires.Dans la plupart des cas, j'obtiens la date de fin de semaine comme un vendredi (la fonction day.of.week
retournera 5) (par exemple, "2010-01-08"
, "2011-02-11"
), mais il y a quelques cas où j'obtiens autre chose que vendredi (samedi / dimanche / jeudi / etc.)
J'ai essayé to.weekly
et to.period(x, period = 'weeks')
et les deux renvoient le même problème.
Pourquoi cela se produit-il?Y a-t-il une solution pour cela ??
Merci !!
[MODIFIER: EXEMPLE CI-DESSOUS]
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)}
Ceci renvoie la (les) date (s) qui ne sont pas le vendredi: time(to.weekly(test.xts))[dayofweek(time(to.weekly(test.xts))) != 5]
La solution
Vous avez 2 problèmes avec votre exemple:
- Votre fonction
dayofweek
est un peu lourde et probablement incorrecte dans ses résultats. - Il manque certaines dates dans votre exemple de dates, telles que le 23/05/2010.
Voici une version nettoyée de votre 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"]
Le seul résultat de cette fonction est
test.xts.Open test.xts.High test.xts.Low test.xts.Close
2010-05-22 -1.705749 1.273982 -2.084203 -1.502611
Le problème, bien sûr, c'est que cette semaine se termine sur 05-23-2010
, mais cette date n'est pas présente dans la série chronologique.Par conséquent, to.weekly
utilise la date la plus proche suivante comme point final, qui est 05-22-2010
.C'est la source de votre problème.
Voici un meilleur exemple, qui ne révèle aucun problème avec la fonction to.weekly
.
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"]