Articles

Utilisation des modules d’apprentissage dates |SAS

Lecture des 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 la date dans SAS. Vous êtes supposé connaître les étapes de lecture des données dans SAS et les instructions d’affectation pour le calcul de nouvelles variables. Si l’un des concepts est complètement nouveau, vous voudrez peut-être consulter plus d’informations ci-dessous pour obtenir des indications sur d’autres modules d’apprentissage. Le fichier de données utilisé dans le premier exemple est présenté ensuite.

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 données et 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 l’impression proc est présentée ci-dessous. Comparez les dates dans les données aux valeurs de bday. Notez que pour John, la date est le 1er janvier 1960 et la valeur pour bday est 0. En effet, les dates sont stockées en interne dans SAS comme le nombre de jours à partir du 1er janvier 1960. Comme Mary 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

Afin de voir les dates de manière à ce que nous comprenions que vous deviez formater la sortie. Nous utilisons la date9. formater pour voir les dates sous la forme ddmmmyyyy. Ceci est spécifié dans une instruction 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

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

1) ils ont tous des mois numériques,
2) ils sont tous ordonnés 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. Un exemple d’utilisation de ce format dans une étape de données suit.

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 de dates dans SAS. Voici 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 distincte 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 composants individuels. Le résultat de l’impression proc suit.

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 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 affiché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 car SAS suppose un seuil (yearcutoff) avant lequel les années à deux chiffres sont interprétées comme l’année 2000 et au-dessus et après quoi elles sont interprétées comme 1999 et au-dessous. La valeur par défaut yearcutoff diffère pour différentes versions de SAS :

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

L’instruction options du programme qui suit change la valeur yearcutoff à 1920. Cela fait en sorte que les années à deux chiffres inférieures à 20 sont lues comme après l’an 2000. L’exécution du même programme donnera alors 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 affiché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

Les 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 chacun au 1er janvier 2000, utilisez la conversion suivante à l’étape données.

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

Le programme avec ce calcul dans le 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 proc sont affiché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 de date utiles

Il existe un certain nombre de fonctions utiles à utiliser avec des 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 proc sont affiché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

Résumé

  • 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.

Les problèmes à rechercher

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