Date de fin de semaine incorrecte en utilisant la fonction 'to.weekly' dans le package 'xts'

StackOverflow https://stackoverflow.com/questions/7366011

  •  28-10-2019
  •  | 
  •  

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]

Était-ce utile?

La solution

Vous avez 2 problèmes avec votre exemple:

  1. Votre fonction dayofweek est un peu lourde et probablement incorrecte dans ses résultats.
  2. 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"]
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top