Lesen von Datumsangaben in Daten
Dieses Modul zeigt, wie man Datumsvariablen liest, Datumsfunktionen verwendet und Datumsanzeigeformate in SAS benutzt. Es wird vorausgesetzt, dass Sie mit Datenschritten zum Einlesen von Daten in SAS und mit Zuweisungsanweisungen zum Berechnen neuer Variablen vertraut sind. Wenn eines der Konzepte für Sie völlig neu ist, sollten Sie unter Weitere Informationen nachsehen, wo Sie Hinweise auf andere Lernmodule finden. Die im ersten Beispiel verwendete Datendatei wird im Folgenden vorgestellt.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
Das folgende Programm liest die Daten ein und erstellt eine temporäre Datendatei namens dates. Beachten Sie, dass die Daten im Datenschritt gelesen werden und das Format date11. verwendet wird, um das Datum zu lesen.
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;
Die Ausgabe des proc print ist unten dargestellt. Vergleichen Sie die Datumsangaben in den Daten mit den Werten von bday. Beachten Sie, dass das Datum für John der 1. Januar 1960 ist und der Wert für bday 0 ist. Das liegt daran, dass Datumsangaben in SAS intern als die Anzahl der Tage ab dem 1. Januar 1960 gespeichert werden. Da Maria vor 1960 geboren wurde, ist der Wert von bday für sie negativ (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
Um die Datumsangaben in einer für uns verständlichen Form zu sehen, müssten Sie die Ausgabe formatieren. Wir verwenden das Format date9. um Datumsangaben in der Form ddmmmyyyy zu sehen. Dies wird in einer Formatanweisung angegeben.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Hier ist die Ausgabe, die von der obigen proc print-Anweisung erzeugt wird.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
Schauen wir uns die folgenden Daten an. Auf den ersten Blick sieht es so aus, als ob die Daten so unterschiedlich sind, dass sie nicht gelesen werden können. Sie haben jedoch zwei Dinge gemeinsam:
1) sie haben alle numerische Monate,
2) sie sind alle nach Monat, Tag und dann Jahr geordnet.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
Diese Daten können im gleichen Format gelesen werden: mmddyyy11. Es folgt ein Beispiel für die Verwendung dieses Formats in einem Datenschritt.
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;
Die Ergebnisse des obigen proc print zeigen, dass alle Daten korrekt gelesen werden.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
Es gibt eine Vielzahl von Formaten, die für das Einlesen von Daten in SAS verwendet werden können. Im Folgenden finden Sie ein Beispiel für einige dieser Formate.
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
Betrachten Sie die folgenden Daten, bei denen die Reihenfolge Monat, Jahr und Tag ist.
7 1948 11 1 1960 110 1970 1512 1971 10
Sie können diese Daten mit jedem Teil des Datums in einer separaten Variablen lesen, wie in dem folgenden Datenschritt.
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;
Beachten Sie die Funktion mdy(Monat,Tag,Jahr) in dem Datenschritt. Diese Funktion dient dazu, aus den einzelnen Komponenten einen Datumswert zu erzeugen. Es folgt das Ergebnis des proc print.
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
Zweistellige Datumswerte
Betrachten Sie die folgenden Daten, die die gleichen wie oben sind, außer dass nur zwei Ziffern für das Jahr verwendet werden und das Jahr zuletzt erscheint.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
Das Lesen der Daten ist dasselbe, wie wir es gerade getan haben.
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;
Die Ergebnisse des proc print sind unten dargestellt.
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
Zweistellige Jahreszahlen funktionieren hier, weil SAS einen Cutoff-Wert (yearcutoff) annimmt, vor dem zweistellige Jahreszahlen als das Jahr 2000 und darüber interpretiert werden und nach dem sie als 1999 und darunter interpretiert werden. Der Standard-Jahresabschneider ist für verschiedene SAS-Versionen unterschiedlich:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
Die Optionsanweisung im folgenden Programm ändert den Jahresabschneiderwert auf 1920. Dies führt dazu, dass zweistellige Jahreszahlen kleiner als 20 als nach dem Jahr 2000 gelesen werden. Die Ausführung desselben Programms führt dann zu anderen Ergebnissen, wenn diese Option eingestellt ist.
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;
Die Ergebnisse des proc print sind unten dargestellt. Die erste Beobachtung wird nun als im Jahr 2018 statt 1918 auftretend gelesen.
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
Berechnungen mit verstrichenen Daten
SAS-Datumsvariablen machen Berechnungen mit Daten sehr bequem. Um zum Beispiel das Alter aller Personen am 1. Januar 2000 zu berechnen, verwenden Sie die folgende Umrechnung im Datenschritt.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
Das Programm mit dieser Berechnung im Kontext folgt.
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;
Das Ergebnis des Proc-Prints ist unten dargestellt. Die Variable AGE2000 enthält nun das Alter in Jahren zum 1. Januar 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
Weitere nützliche Datumsfunktionen
Es gibt eine Reihe von nützlichen Funktionen für die Verwendung mit Datumsvariablen. Im Folgenden werden einige dieser Funktionen aufgeführt.
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);
Das folgende Programm demonstriert die Verwendung dieser Funktionen.
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;
Die Ergebnisse von proc print sind unten dargestellt. Die neuen Variablen enthalten den Monat, den Tag, das Jahr, den Wochentag und das Quartal.
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
Zusammenfassung
- Datumsangaben werden mit Datumsformaten gelesen, am häufigsten Datum9. und mmddyy11.
- Datumsfunktionen können verwendet werden, um Datumswerte aus ihren Komponenten zu erzeugen (mdy(m,d,y)), und um die Komponenten aus einem Datumswert zu extrahieren (month(),day(), etc.).
- Die Option yearcutoff kann verwendet werden, wenn Sie zweistellige Jahreszahlen lesen müssen.
Probleme, auf die man achten sollte
- Datumsangaben sind innerhalb eines Feldes so vermischt, dass kein einziges Datumsformat sie lesen kann. Lösung: Lesen Sie das Feld als Zeichenfeld, testen Sie die Zeichenkette und verwenden Sie die Eingabefunktion und das entsprechende Format, um den Wert in die Datumsvariable zu lesen.
- Es gibt kein Format, das das Datum lesen kann. Lösung: Lesen Sie das Datum als Komponenten und verwenden Sie eine Funktion, um einen Datumswert zu erzeugen.
- Manchmal ist die Voreinstellung für yearcutoff nicht die Voreinstellung für die oben genannte Version des Pakets. Lösung: Um die aktuelle Einstellung für yearcutoff zu ermitteln, führen Sie einfach ein Programm aus, das
PROC OPTIONS OPTION=YEARCUTOFF; RUN;
Dies führt zu einer Ausgabe, die den aktuellen Wert von yearcutoff enthält.