
Afficher 7h30 du matin sous la forme 07:30
octobre 24, 2008Les heures, minutes et secondes sont enregistrables sous SAS sous la forme d’un seul chiffre exprimant cette durée en seconde. On parle d’heure SAS (SAS time). A l’affichage, il y a le format TIME5. pour représenter les heures et les minutes uniquement à partir de 5 caractères au maximum. Mais ce format omet le zéro de début pour les heures à un chiffre comme 9h00. Voici donc dans cet article plusieurs solutions pour contourner le problème allant d’un format avec PICTURE, en passant par les fonctions RIGHT et TRANWORD.
1. Le data set servant d’exemple
Pour présenter les variantes, un data set NEWTIME est créé. Il contient une variable SEC avec 4 valeurs exprimant le temps en secondes et une valeur manquante.
- 7h30 : prenons 7h30m00s ou 27000 secondes (7x60x60*60) pour exprimer 7h30 du matin
- 15h : prenons maintenant 15h00m00s ou 54000 secondes pour obtenir 15h
- 14h59 : pour désigner 14h59, des valeurs entre 14h59m00s (53940 sec) et 14h59m59s (53999 sec) sont possibles. Dans l’exemple, ces deux extrêmités sont choisies.
data newtime; input sec; datalines; 27000 54000 53940 53999 . ; run;
2. Un format créé avec l’instruction PICTURE
La solution la plus flexible est probablement de créer un nouveau format. De cette manière, la valeur d’origine en seconde est encore disponible. Ce format peut aussi servir à convertir une variable caractère en heure SAS.
L’instruction PICTURE : Le format SASREF est construit à partir de l’instruction PICTURE dans une procédure PROC FORMAT. Le symbole %H réfère à des heures allant de 0h à 23h. Le symbole %M désigne des minutes allant de 0min à 59min. Le zéro intercalé ajoutera un zéro pour les valeurs inférieures à 10.
Documentation : Vous pouvez consulter la documentation en ligne pour connaître tous les symbole comme %M, %H disponible avec l’instruction PICTURE : PICTURE Statement.
proc format; picture sasref other='%0H:%0M' (datatype=time); run;
Dans cet exemple, une variable caractère TIME_C est créée à partir de la fonction PUT et du format SASREF affichant 5 caractères.
Vous pouvez aussi exécuter l’instruction FORMAT pour appliquer le format SASREF5. à la variable SEC.
data newtime; set newtime; time_c=put(sec,sasref5.); *format sec sasref5.; run;
3. Ajouter une condition pour traiter les valeurs manquantes
Une seconde variable TIME_C2 applique une contrainte particulière pour les valeurs manquantes. En effet, le format SASREF renvoie le mot ERROR si la valeur d’origine est manquante.
data newtime; set newtime; if not missing (sec) then time_c2=put(t1,sasref5.); run;
4. Passer d’une valeur texte 7:30 à une valeur 07:30 avec les fonctions RIGHT et TRANWRD
Une troisième variable TIME_C3 est construite en deux étapes. Voyons donc l’interprétation faite pour une heure comme 7:30.
- Fonction PUT et format TIME5 pour créer une valeur 7:30 : Tout d’abord, la fonction PUT combinée au format TIME5. crée une variable caractère de la forme 7:30 avec une longueur de 5. Par défaut, le texte est aligné à gauche. Le blanc est donc situé en 5ème position.
- Fonctions RIGHT et TRANWORD pour ajouter un blanc en tête : Ensuite, une variable caractère 7:30 est convertie en 07:30, etc. Dans un premier temps, la fonction RIGHT aligne le texte à droite. Le blanc est en première position. Dans un second temps, la fonction TRANWRD remplace le blanc par un zéro.
data newtime; set newtime; if not missing (sec) then time_c3=tranwrd(right(put(sec,time5.),' ','0'); run;
LA documentation en ligne propose une page sur les fonctions TRANWORD et RIGHT.
- TRANWORD Function
- RIGHT Function
Vous pouvez aussi consultez l’article sur la fonction PUT :
5. Aperçu des données
Voici un aperçu des différentes variables après :
sec time_c time_c2 time_c3 27000 07:30 07:30 07:30 53940 14:59 14:59 14:59 53999 14:59 14:59 14:59 54000 15:00 15:00 15:00 . ERROR
[…] Un exemple d’utilisation de la fonction TRANWRD : “Afficher 7h30 sous la forme 07:30“. […]
le code ne fonctionne pas en l’état. (manque de parenthèses, mauvais noms d’items)
ci-dessous un début de correction.
data newtime;
input sec;
datalines;
27000
54000
53940
53999
.
;
run;
proc format;
picture sasref other=’%0H:%0M’ (datatype=time);
run;
data newtime;
set newtime;
if not missing (sec) then time_c2=put(sec,sasref5.);
run;
data newtime;
set newtime;
if not missing (sec)
then time_c3=tranwrd(right(put(sec,time5.)),’ ‘,’0’);
run;
[…] Afficher 7h30 du matin sous la forme 7:30 […]