Posts Tagged ‘informat’

h1

Protégé : Entrer une date avec l’informat ANYDTDTE

juin 6, 2010

Cet article est protégé par un mot de passe. Pour le lire, veuillez saisir votre mot de passe ci-dessous :

Publicités
h1

Créer une date SAS de 3 manières

avril 28, 2008

Cet article a été réécrit. Il est disponible sur programmeur-pro.com

 

Le langage SAS utilise sa propre échelle de temps. Dans un premier temps, je vous rappèle comment est définie une date, une heure et une combinaison de l’heure et du jour. Puis, je vous propose trois alternatives pour convertir ou créer ces valeurs.

1. Rappel sur la notion de date SAS et datetime SAS

Date : Une date SAS est un nombre entier égal au nombre de jours écoulés depuis le 1er janvier 1960. Les dates avant 1960 sont donc négatives. Le 1er janvier 1960 est égal à zéro. Ainsi la différence entre deux dates SAS est un nombre de jours.

Time : Un time SAS est un nombre représentant le nombre de secondes écoulées depuis minuit. Il varie entre 0 et 86400 (60 secondes * 60 minutes *24 heures). La différence entre deux times SAS est un nombre de secondes.

Datetime : Un datetime SAS est un nombre représentant le nombre de secondes écoulées depuis le 1er janvier 1960. Ce nombre aura une valeur décimale si on utilise des dixièmes de secondes. Mais ceci est rare. La différence entre deux datetimes SAS est donc un nombre de secondes.

Avantages : Ces nombres facilitent les calculs sur le temps écoulé. De plus, les fonctions de temps SAS ont besoin de ces valeurs. Ainsi la fonction MONTH extrait le mois d’une date SAS (SAS Online Doc. : Liste des fonctions DATE).

Inconvénient et parade : pour lire ces dates/time/datetime, on préfère les voir en langage humain. Soit un format est appliqué sur la valeur numérique, soit une variable caractère est créée avec une fonction PUT et le nom du format. Ce sujet ne sera pas détaillé dans cet article.

SAS Online Doc : About SAS Date, Time and Datetime Values

2. Les fonctions MDY et DHMS

Créer une date avec la fonction MDY : La fonction MDY crée une date SAS. Elle a besoin de trois informations : le mois, le jour et l’année. Aux Etats-Unis, le mois apparaît en premier dans la date, suivi du jour et enfin du mois. Les trois paramètres de cette fonction sont donc des valeurs numériques. Le langage SAS ayant été créé aux Etats-Unis, l’ordre des paramètres de la fonction MDY est le même. Le nom de la fonction est lui-même parlant : M pour month, D pour day et Y pour year.

visit_dt = mdy(visit_m,visit_d,visit_y);

Créer un time avec la fonction HMS : la fonction HMS retourne un time SAS. Elle est composée de l’heure, des minutes et des secondes.

visit_hour = hms(vist_hr,visit_min,visit_sec);

Créer un datetime avec la fonction DHMS : Créer une datetime avec la fonction DHMS : la fonction DHMS créer une datetime SAS. Elle a 4 paramètres : la date SAS, l’heure, les minutes et les secondes.

visit_time = dhms(visit_dt, vist_hr,visit_min,visit_sec);

3. Lire un texte et le convertir en date/time/datetime

On peut lire une valeur texte et demander à SAS de l’interpréter comme une date. Il faut alors que ce texte suivre une des structures répertoriées par SAS. On parle d’informat. En voici la liste complète : SAS Online Doc., Informats by Category. La fonction INPUT est alors utilisée. Le premier paramètre est soit une valeur texte entre guillemets, soit une variable texte.

DATE informat : Une des notations les plus utilisées pour lire des dates est le jour suivi des trois premières lettres du mois en anglais et enfin de l’année exprimée avec 4 chiffres. La longueur totale étant de 9 caractères, l’informat s’appelle date9. DATE. a pour valeur par défaut 7. Cela impose une année à 2 chiffres.

jour = input(’25NOV1952′,date9.);

nov_dt = input(’25NOV52′,date7.); *attention à l’option globale YEARCUTOFF qui décidera s’il s’agit de 1952 ou 2052 par exemple (voir la note plus bas);

TIME informat : L’informat TIME. a pour longueur par défaut 8. Donc TIME. et TIME8. sont identiques.

heure = input(’08:15:00′,time.);

DATETIME informat : L’informat DATETIME. a pour longueur par défaut 18. Ainsi DATETIME. et DATETIME18. sont identiques.

jour_heure = input(’25NOV1952:08:15:10′,datetime.);

Note sur l’option YEARCUTOFF :

a. Identifier la valeur actuelle de YEARCUTOFF : pour savoir quelle est l’année de YEARCUTOFF, consultez la log après avoir soumis le code suivant :

proc options;
run;

b. Changer le yearcutoff : pour alterner cette valeur, utilisez l’instruction globale OPTIONS et le mot-clé YEARCUTOFF.

options yearcutoff=1950;

c. Interprétation : avec une YEARCUTOFF de 1920,

  • une année inférieure à 20 sera interprétée comme égale à une année 2000 :  20xx.
  • Une année supérieure ou égale à 1920 sera interprétée comme une année 1900 : 19xx

4. Ecrire manuellement quelques valeurs date/time/datetime

Une manière rapide de créer une date SAS si, et seulement si, on a très peu de valeurs à entrer est de faire suivre la valeur texte de d, t ou dt selon qu’il s’agisse d’une date, d’un time ou d’un datetime.

x = ‘ 25NOV1952’d;

x = ’08:15:00’t;

x = ’25NOV1952:08:15:10’dt;

SAS Online Doc. : SAS Constants in Expressions

h1

Convertir une variable caractère en numérique et inversement

avril 21, 2008

Cet article est maintenant réécrit. Vous le retrouvez sur www.programmeur-pro.com.

Passer d’une variable numérique à une variable caractère ou inversement est fréquent en langage de programmation SAS. Les fonctions INPUT et PUT permettent de changer ainsi le type de la variable. Dans un premier temps, je vous propose deux exemples pour illustrer les deux situations. Dans un second temps, on verra deux emplois supplémentaires de la fonction PUT : ajouter des zéros avant et après le nombre, et passer d’une valeur caractère à une autre valeur caractère.

Exemples d’application : dans la vie courante, il est fréquent de créer une variable texte à partir de plusieurs autres. Dans le lot, il y a souvent une variable numérique. Celle-ci doit être convertie en texte avant la concaténation. A l’inverse, on peut vouloir extraire le chiffre d’une chaîne de caractère et le sauvegarder dans une variable numérique.

Note : Dans un data step, on est obligé de créer de donner un nom différent à la variable d’origine et à la nouvelle variable. Il est alors courant de renommer au préalable la variable d’origine pour pouvoir utiliser son nom pour la nouvelle variable. Ensuite, la variable d’origine est supprimée. Dans une procédure SQL, le même nom peut être utilisé.

1. Du caractère au numérique et inversement

La fonction INPUT est composée de deux paramètres : la variable texte ou directement la chaîne de caractère d’un côté, l’informat de l’autre.

Du caractère au numérique : ici, on indique à la machine qu’il faut lire la variable d’origine comme une variable texte pouvant atteindre une longueur de 16 caractères. Pour cela on utilise l’informat $16. On peut aussi choisir un informat $CHAR. : ici $CHAR16. (SAS Online Doc. : INPUT Function, Informats by Category)

data char_to_num;
  x_char = ‘123456789.123456’;
  x_num = input(x_char,$16.);
*x_num = 123456789.123456;
run;

Note : Pensez à ajouter un format sur la variable numérique si vous ne la lisez pas intégralement dans votre output.

Du numérique au caractère : dans l’exemple ci-dessous, on indique que la valeur à créer sera numérique avec 16 chiffres/point dont 6 après la virgule. C’est l’information donnée par le format numérique 16.6. Bien sûr, on peut avoir la longueur nombre à convertir peut-être plus petit sans risquer d’affecter la valeur. Une autre possibilité est d’utiliser le format BEST16. Si aucun nombre n’est précisé (BEST.) cela revient à BEST8. SAS cherche alors la meilleure réponse possible permettant d’entrer 8 chiffres/point. Les décimales pourront être tronquées s’il n’y a pas assez de place, voir les entiers.

data num_to_char;
  y_num = 123456789.123456;
  y_char = put(y_num,16.6);
*y_char = ‘123456789.123456’;
run;

2. Les plus de la fonction PUT

Ajouter des zéros aux extrémités du nouveau texte : le format z. permet de remplacer les espaces vides par des zéros. Dans l’exemple ci-dessous, la nouvelle variable aura une longueur de 8 caractères. Les deux derniers seront les chiffres après la virgule. Comme il n’y en a qu’un seul dans la variable d’origine, un zéro sera ajouté à la fin. Il reste deux espaces en début à remplir avec des zéros.

data num_char_zero;
   z_num = 123.1;
   z_char = put(z_num,z8.2);
  *z_char = ‘00123.10’;
run;

Passer d’une valeur caractère à une autre : la valeur caractère d’origine peut aussi être du texte et non des chiffres. Dans cette situation, la nouvelle variable prend la valeur d’un format caractère souvent défini par le programmeur.

proc format;
  value $cntry
  FR = ‘France’
  LU = ‘Luxembourg’
  CH = ‘Suisse’;
run;

data char_to_char;
  a1_char=’LU’;
  a2_char=put(a1_char,$cntry.);
  *a2_char=’Luxembourg’;
run;

h1

Changer la séquence d’affichage des variables

avril 7, 2008

Pour changer l’ordre des variables dans un jeu de données, il faut demander à SAS de relire l’intégralité des données dans l’ordre souhaité. Deux méthodes sont disponibles : un data step ou une procédure SQL. Dans le cas particulier où les variables sont à afficher par ordre alphabétique, on pourra extraire la liste des variables des dictionnaires SAS et la sauvegarder dans une macro variable.

Je vous propose donc de voir l’approche avec le data step, puis celle avec la PROC SQL et enfin d’ajouter un exemple particulier utilisant en plus les dictionnaires.

1. Définir la séquence des variables dans un data step : l’ordre de lecture des noms de variables déterminera l’ordre d’apparition dans le jeu de données.

1.1 Une instruction INPUT : Dans l’exemple ci-dessous, où seule l’instruction INPUT est utilisée, la variable YR02 apparaît en premier suivie de YR00, YR99 et YR01. 

data one;
  input yr02 19 date9. yr00 1120 date9. yr99 yr01 $;
  datalines;
02APR2002 21FEB2001 3.52 C
;
run;

1.2 Les instructions RETAIN, FORMAT, INFORMAT, LABEL, ATTRIB : maintenant, on ajoute avant l’instruction INPUT des instructions RETAIN, FORMAT, INFORMAT, LABEL et ATTRIB. Ainsi, on voit que ces instructions affectent l’ordre d’apparition des variables : YR98, YR99,… YR02.

data one;
  retain yr98 ‘REF’;
  format yr99 best.;
  informat yr00 date9.;
  label yr01=‘Annee 2001’;
  attrib yr02 format=date9.
              informat=date9.
              label=‘Annee 2002’;
  input yr02 yr00 yr99 yr01 $;
  datalines;
02APR2002 21FEB2001 3.52 C
;
run;

1.3 L’instruction SET : de la même manière, l’instruction SET défini l’ordre d’apparition des variables pas encore mentionnées.

2. Lister les variables dans une procédure SQL.

2.1 Lister les variables manuellement : les variables du jeu de données SASHELP.CLASS apparaissent dans l’ordre suivant : NOM, SEX, AGE, HEIGHT et WEIGHT. Pour changer cet ordre, avec une procédure SQL, il faut les lister individuellement. Dans l’exemple qui suit, les variables apparaissent par ordre alphabétique.

proc sql;
  create table class as
  select age, height, name, sex, weight
  from sashelp.class;
quit;

2.2 Automatiser la démarche : Si vous avez plus de 300 variables à lister, cela devient vite très contraignant. Pour rendre la tâche plus simple, on sauvegarde la liste des variables par ordre alphabétique dans une macro variable. Le nom de toutes les variables est disponible dans le dictionnaire TABLES.

proc sql noprint;
  select name into : var_lst separated by ‘, ‘
     from dictionary.columns
     where upcase(libname)=‘SASHELP’ and
           upcase(memname)=‘CLASS’
     order by name;
  create table class as
     select &
var_lst.
     from sashelp.class;
quit;