gestion du format des dates

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

gestion du format des dates

Messagepar Stéphane Laurent » 02 Mai 2007, 14:31

Bonjour,

Actuellement j'ai besoin d'importer des tables SAS (fichier .sas7bdat) dans R. J'y parviens en convertissant la table SAS au format XPORT puis avec le package foreign de R

Mais j'ai un problème avec le format des dates.

Exemple :
- quand la date dans la table SAS est 25/01/2001 et que je fais l'import dans R, j'obtiens 15000, ce qui signifie que le 25/01/2001 est le 15000ème jour depuis le 1er janvier 1960.
- quand la date dans la table SAS est 25JAN2001 et que je fais l'import dans R, j'obtiens la même chose : la chaîne de caractères 25JAN2001.

Le coup du 15000 est bien adapté pour calculer des durées. Je me demande si dans R il y aurait une fonction permettant de convertir 25JAN2001 en 15000, ou quelque chose du genre.

Je m'étais dit que ce n'est pas compliqué de faire soi-même une telle fonction, mais je n'avais pas pensé aux années bissextiles...

Merci pour votre attention,

Stéphane.

PS : bon c'est vrai les années bissextiles ce n'est pas si méchant que ça à gérer mais ça ne m'étonnerait pas qu'une telle fonction existe déjà.

Renaud Lancelot
Messages : 2484
Enregistré le : 16 Déc 2004, 08:01
Contact :

Messagepar Renaud Lancelot » 02 Mai 2007, 16:59

Le pb vient du format non standard de la chaîne de caractères. Il faut passer par une petite fct pour remettre tout ça en ordre:

Code : Tout sélectionner

> jma <- function(x){
+   j <- substring(x, 1, 2)
+   m <- substring(x, 3, 5)
+   a <- substring(x, 6, 9)
+   M <- sapply(m, function(y) switch(y,
+               JAN = 1, FEV = 2, MAR = 3, AVR = 4,
+               MAI = 5, JUN = 6, JUL = 7, AOU = 8,
+               SEP = 9, OCT = 10,NOV = 11, DEC = 12))
+   ISOdate(year = a, month = M, day = j, hour = 0, min = 0, sec = 0, tz = "")
+   }
> jma(c("25JAN2001", "13JUN2009", "09NOV2003"))
[1] "2001-01-25 Paris, Madrid"               "2009-06-13 Paris, Madrid (heure d'été)" "2003-11-09 Paris, Madrid"             


A adapter à la manière dont les mois sont codés, et en vérifiant si les jours sont codés toujours sur deux caractères ou pas.

Renaud

Stéphane Laurent
Messages : 1557
Enregistré le : 05 Déc 2006, 19:07

Messagepar Stéphane Laurent » 02 Mai 2007, 19:14

Merci bien, je ne connaissais pas la fonction ISOdate(). J'ai testé et j'ai constaté que l'on peut obtenir le nombre de jours entre 2 dates en les soustrayant, ce qui va me permettre de m'en sortir.

Merci beaucoup pour la fonction jma().


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 1 invité