web-dev-qa-db-fra.com

Convertir le numéro de semaine en date

J'ai une trame de données en R avec la semaine de l'année que j'aimerais convertir en date. Je sais que je dois choisir une année et un jour de la semaine, donc je fixe ces valeurs pour 2014 et 1. Convertir cela en une date semble simple: 

as.Date(paste(2014,df$Week,1,sep=""),"%Y%U%u")

Mais ce code ne fonctionne que si la semaine est supérieure à 9. Les semaines 1 à 9 retournent NA. Si je change la semaine en 01,02,03 ..., il retourne quand même NA. 

Quelqu'un voit ce que je manque?

12
Aaron Soderstrom

as.Date appelle NA de 1 à 9 car il attend deux chiffres pour le numéro de semaine et ne peut pas l'analyser correctement.

Pour résoudre ce problème, ajoutez-en quelques-uns - pour séparer les choses:

as.Date(paste(2014, df$Week, 1, sep="-"), "%Y-%U-%u")
14
jeremycg

Une autre solution consiste à utiliser l'arithmétique de date du paquet lubridate:

lubridate::ymd( "2014-01-01" ) + lubridate::weeks( df$Week - 1 )

Le -1 est nécessaire car 2014-01-01 est déjà la semaine 1. En d'autres termes, nous voulons:

  • df$Week == 1 à mapper sur 2014-01-01 (qui est ymd("2014-01-01") + weeks(1-1))
  • df$Week == 2 à mapper sur 2014-01-08 (qui est ymd("2014-01-01") + weeks(2-1))
  • etc.
5
Artem Sokolov
It will be like using 2nd year = (week-52), 3rd year  = (week -104)...so on

for(i in 1:456548)
{
  if (train[i,2] > 0 & train[i,2] <53)
  {
    train["weekdate"] <- as.Date(paste(2016, train$week, 1, sep="-"), "%Y-%U-%u")
  }
  if (train[i,2] > 52 & train[i,2] <105)
  {
    train["weekdate"] <- as.Date(paste(2017, (train$week-52), 1, sep="-"), "%Y-%U-%u")
  }
  if (train[i,2] > 104 & train[i,2] <150)
  {
    train["weekdate"] <- as.Date(paste(2018, (train$week-104), 1, sep="-"), "%Y-%U-%u")
  }

}
0
user2640679