Lire les dates dans les données

Ce module montrera comment lire les variables de date, utiliser les fonctions de date et utiliser les formats d’affichage de date dans SAS. On suppose que vous êtes familier avec les étapes de données pour lire les données dans SAS, et les instructions d’affectation pour calculer de nouvelles variables. Si l’un des concepts est complètement nouveau, vous pouvez consulter la section Pour en savoir plus ci-dessous pour obtenir des indications sur les autres modules d’apprentissage. Le fichier de données utilisé dans le premier exemple est présenté ci-après.

John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959

Le programme ci-dessous lit les données et crée un fichier de données temporaire appelé dates. Notez que les dates sont lues dans l’étape de données, et que le format date11. est utilisé pour lire la date.

DATA dates; INPUT name $ 1-4 @6 bday date11.;CARDS;John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959;RUN;PROC PRINT DATA=dates;RUN; 

La sortie de la proc print est présentée ci-dessous. Comparez les dates dans les données aux valeurs de bday. Notez que pour Jean, la date est le 1er janvier 1960 et que la valeur de bday est 0. Cela est dû au fait que les dates sont stockées en interne dans SAS comme le nombre de jours à partir du 1er janvier 1960. Comme Marie est née avant 1960, la valeur de bday pour elle est négative (-1635).

OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207

Pour voir les dates d’une manière que nous comprenons, il faudrait formater la sortie. Nous utilisons le format date9. pour voir les dates sous la forme ddmmmyyyy. Ceci est spécifié sur une instruction de format.

 PROC PRINT DATA=dates; FORMAT bday date9. ;RUN; 

Voici la sortie produite par l’instruction proc print ci-dessus.

OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959

Regardons les données suivantes. À première vue, il semble que les dates soient si différentes qu’elles ne pourraient pas être lues. Elles ont pourtant deux choses en commun :

1) elles ont toutes des mois numériques,
2) elles sont toutes ordonnées mois, jour, puis année.

John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959

Ces dates peuvent être lues avec le même format, mmddyy11. Voici un exemple de l’utilisation de ce format dans une étape de données.

DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;

Les résultats de l’impression proc ci-dessus montrent que toutes les dates sont lues correctement.

OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959

Il existe une grande variété de formats disponibles pour la lecture des dates dans SAS. Ce qui suit est un exemple de certains de ces formats.

Informat Description Range Width Sample-------- ----------- ----- ------- ------JULIANw. Julian date 5-32 5 65001 YYDDDDDMMYYw. date values 6-32 6 14/8/1963MONYYw. month and year 5-32 5 JUN64YYMMDDw. date values 6-32 8 65/4/29YYQw. year and quarter 4-32 4 65Q1

Considérez les données suivantes dans lesquelles l’ordre est le mois, l’année et le jour.

 7 1948 11 1 1960 110 1970 1512 1971 10 

Vous pouvez lire ces données avec chaque partie de la date dans une variable séparée comme dans l’étape de données qui suit.

DATA dates; INPUT month 1-2 year 4-7 day 9-10; bday=MDY(month,day,year);CARDS; 7 1948 11 1 1960 110 1970 1512 1971 10;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;

Notez la fonction mdy(mois,jour,année) dans l’étape de données. Cette fonction est utilisée pour créer une valeur de date à partir des différents composants. Le résultat de l’impression de la proc est le suivant .

OBS MONTH YEAR DAY BDAY 1 7 1948 11 11JUL1948 2 1 1960 1 01JAN1960 3 10 1970 15 15OCT1970 4 12 1971 10 10DEC1971

Dates à deux chiffres

Considérez les données suivantes, qui sont les mêmes que ci-dessus, sauf que seuls deux chiffres sont utilisés pour signifier l’année, et que l’année apparaît en dernier.

 7 11 18 7 11 48 1 1 6010 15 7012 10 71

La lecture des données est la même que celle que nous venons de faire.

DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;

Les résultats de l’impression proc sont présentés ci-dessous.

OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL1918 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971

Les années à deux chiffres fonctionnent ici parce que SAS suppose une coupure (yearcutoff) avant laquelle les années à deux chiffres de valeur sont interprétées comme l’année 2000 et plus et après laquelle elles sont interprétées comme 1999 et moins. Le yearcutoff par défaut diffère selon les versions de SAS :

SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)

L’instruction d’options du programme qui suit change la valeur du yearcutoff à 1920. Ainsi, les années à deux chiffres inférieures à 20 sont lues comme étant postérieures à l’an 2000. L’exécution du même programme ensuite donnera des résultats différents lorsque cette option est définie.

OPTIONS YEARCUTOFF=1920;DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;

Les résultats de l’impression proc sont présentés ci-dessous. La première observation est maintenant lue comme se produisant en 2018 au lieu de 1918.

OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL2018 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971

Calculs avec des dates écoulées

Les variables de date SAS rendent les calculs impliquant des dates très pratiques. Par exemple, pour calculer l’âge de tout le monde au 1er janvier 2000, utilisez la conversion suivante dans l’étape des données.

 age2000=(mdy(1,1,2000)-bday)/365.25 ; 

Le programme avec ce calcul en contexte suit.

OPTIONS YEARCUTOFF=1900; /* sets the cutoff back to the default */DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; age2000 = (MDY(1,1,2000)-bday)/365.25 ;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;

Les résultats de l’impression du proc sont présentés ci-dessous. La variable AGE2000 contient maintenant l’âge en années au 1er janvier 2000.

OBS NAME BDAY AGE2000 1 John 01JAN1960 40.0000 2 Mary 11JUL1955 44.4764 3 Joan 11JUL1955 44.4764 4 Kate 12NOV1962 37.1362 5 Mark 08JUN1959 40.5667

Autres fonctions utiles de date

Il existe un certain nombre de fonctions utiles à utiliser avec les variables de date. Voici une liste de certaines de ces fonctions.

Function Description Sample-------- --------------------- -----------------month() Extracts Month m=MONTH(bday);day() Extracts Day d=DAY(bday) ;year() Extracts Year y=YEAR(bday);weekday() Extracts Day of Week wk_d=WEEKDAY(bday);qtr() Extracts Quarter q=QTR(bday);

Le programme suivant démontre l’utilisation de ces fonctions.

DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; m=MONTH(bday); d=DAY(bday) ; y=YEAR(bday); wk_d=WEEKDAY(bday); q=QTR(bday);CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; VAR bday m d y; FORMAT bday date9. ;RUN;PROC PRINT DATA=dates; VAR bday wk_d q; FORMAT bday date9. ;RUN;

Les résultats de l’impression du proc sont présentés ci-dessous. Les nouvelles variables contiennent le mois, le jour, l’année, le jour de la semaine et le trimestre.

OBS BDAY M D Y 1 01JAN1960 1 1 1960 2 11JUL1955 7 11 1955 3 11JUL1955 7 11 1955 4 12NOV1962 11 12 1962 5 08JUN1959 6 8 1959OBS BDAY WK_D Q 1 01JAN1960 6 1 2 11JUL1955 2 3 3 11JUL1955 2 3 4 12NOV1962 2 4 5 08JUN1959 2 2

Sommaire

  • Les dates sont lues avec des formats de date, le plus souvent date9. et mmddyy11.
  • Les fonctions de date peuvent être utilisées pour créer des valeurs de date à partir de leurs composants (mdy(m,d,y)), et pour extraire les composants d’une valeur de date (month(),day(), etc.).
  • L’option yearcutoff peut être utilisée si vous devez lire des années à deux chiffres.

Problèmes à surveiller

  • Les dates sont mélangées dans un champ de telle sorte qu’aucun format de date unique ne peut les lire. Solution : Lire le champ comme un champ de caractères, tester la chaîne de caractères et utiliser la fonction de saisie et le format approprié pour lire la valeur dans la variable date.
  • Il n’y a pas de format capable de lire la date. Solution : lire la date en tant que composants et utiliser une fonction pour produire une valeur de date.
  • Parfois, la valeur par défaut pour yearcutoff n’est pas celle de la version du paquet mentionné ci-dessus. Solution : pour déterminer le paramètre actuel de yearcutoff, exécutez simplement un programme contenant
    PROC OPTIONS OPTION=YEARCUTOFF ; RUN;
    Il en résultera une sortie contenant la valeur actuelle de yearcutoff.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.