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

9 commentaires

  1. je voudrai savoi comment tranformer 150230 en 15heur 02 minute et 30 seconde (15:02:30) format d’heur


  2. Raisonnement

    1. Consultation des informats disponibles : je ne vois pas d’informat ayant la forme d’entrer 150230 dans la documentation en ligne

    http://support.sas.com/onlinedoc/913/getDoc/de/lrdict.hlp/a001239776.htm

    2. Existe-t-il un informat qui s’y rapproche ? oui TIME8.

    – Il faut donc ajouter des « : » entre chaque composant pour avoir la même structure que celle caractérisant TIME8.

    Dans l’exemple, j’utilise la fonction de concaténation CATX et la fonction qui extrait des sous-ensembles de la chaîne SUBSTR.

    – Puis on crée une nouvelle variable (une date SAS) en se basant sur cette valeur caractère en utilisant cet informat TIME8. dans la fonction INPUT.

    – Enfin si on veut voir la valeur sous la forme 15:02:30, il suffit d’assigner un format TIME8 à cette nouvelle variable.

    data one;
    x=’150230′;
    y=input(catx(‘:’,substr(x,1,2),substr(x,3,2),substr(x,5,2)),time.);
    format y time8.;
    run;

    proc print data=one;
    run;


  3. Bonjour,
    Je voudrai un format date-heure de la forme: jj/mm/aaaa hh:mm:ss
    Merci pour les réponses.


  4. Bonjour,

    Au prime abord, en consultant la liste des formats SAS (http://support.sas.com/onlinedoc/913/getDoc/fr/lrdict.hlp/a001263753.htm), ceux qui ressemble le plus à celui que vous recherchez sont

    – DATETIME
    – EURDFDT

    Peut-être que que certaines langues qui utilisent EURDFDT sont dans la forme que vous recherchez mais je n’ai pas plus d’information.

    Maintenant, vous pouvez vous en sortir en créant une variable caractère :

    1. Extraire la DATE avec une fonction DATEPART et utiliser un format DDMMYY10. dans une fonction PUT

    2. Extraire le TIME avec une fonction TIMEPART et utiliser un TIME8 dans une fonction PUT.

    3. Et concaténer les deux avec || ou avec une fonction CAT (CAT, CATS,CATX ou CATT).

    Cordialement,

    Véronique


  5. c’est nul comment tu fais ca tu pourrait m’expliquer ca , tu as l’air tres forte dans ce domaine ;-), tu sais bien te servir de ce quon te donne..


  6. […] Créer une date SAS de 3 manières […]


  7. bonjour,
    j’ai une variable au format jj/mm/aaaa hh:mm:ss et je voudrai juste jj/mm/aaaa comment faire? merci


  8. Bonjour j’aimerai savoir comment transformer des données journalières en données mensuelles. Merci


  9. Bonjour, j’aimerais détecter des erreurs potentielles dans une variable « date_naissance » qui se présente sous la forme jours/mois/année en chiffres. J’aimerais donc savoir par exemple si certains mois > 12 par ex.
    Pour cela, il faudrait identifier les mois en créant une nouvelle variable, mais comment ?
    Merci pour vos réponses.



Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :