Verwenden von Daten / SAS-Lernmodulen
Lesen von Daten in Daten
Dieses Modul zeigt, wie Datumsvariablen gelesen, Datumsfunktionen verwendet und Datumsanzeigeformate in SAS verwendet werden. Es wird davon ausgegangen, dass Sie mit Datenschritten zum Lesen von Daten in SAS und Zuweisungsanweisungen zum Berechnen neuer Variablen vertraut sind. Wenn eines der Konzepte völlig neu ist, möchten Sie vielleicht unten nach weiteren Informationen suchen, um Anweisungen zu anderen Lernmodulen zu erhalten. Die im ersten Beispiel verwendete Datendatei wird als nächstes vorgestellt.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
Das folgende Programm liest die Daten und erstellt eine temporäre Datendatei namens dates. Beachten Sie, dass die Daten im Datenschritt gelesen werden, und das Format date11. wird verwendet, 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-Drucks ist unten dargestellt. Vergleichen Sie die Daten in den Daten mit den Werten von bday. Beachten Sie, dass für John das Datum 1 Jan 1960 und der Wert für bday 0 ist. Dies liegt daran, dass Datumsangaben intern in SAS als Anzahl der Tage ab Jan 1,1960 gespeichert werden. Da Mary 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 Daten so zu sehen, wie wir es verstehen, müssten Sie die Ausgabe formatieren. Wir verwenden das date9. format, um Daten in der Form ddmmyyyy anzuzeigen. Dies wird in einer Formatanweisung angegeben.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Hier ist die Ausgabe der obigen proc print-Anweisung.
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 wären die Daten so unterschiedlich, dass sie nicht gelesen werden konnten. Sie haben zwei Dinge gemeinsam:
1) Sie haben alle numerische Monate,
2) Sie sind alle geordnet nach Monat, Tag und dann Jahr.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
Diese Daten können mit dem gleichen Format gelesen werden, mmddyy11. Ein Beispiel für die Verwendung dieses Formats in einem Datenschritt folgt.
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-Drucks zeigen, dass alle Daten korrekt gelesen wurden.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
Es gibt eine Vielzahl von Formaten zum Lesen von Daten in SAS. 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, in 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 im 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) im Datenschritt. Mit dieser Funktion wird aus den einzelnen Komponenten ein Datumswert erstellt. Das Ergebnis des Proc-Drucks folgt.
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 Daten
Betrachten Sie die folgenden Daten, die die gleichen wie oben sind, außer dass nur zwei Ziffern verwendet werden, um das Jahr anzuzeigen, und das Jahr erscheint zuletzt.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
Das Lesen der Daten ist das gleiche wie gerade.
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-Drucks 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 Jahre funktionieren hier, da SAS einen Cutoff (yearcutoff) annimmt, vor dem zweistellige Jahre als das Jahr 2000 und darüber und danach als 1999 und darunter interpretiert werden. Der standardmäßige yearcutoff unterscheidet sich für verschiedene SAS-Versionen:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
Die options-Anweisung im folgenden Programm ändert den yearcutoff-Wert auf 1920. Dies führt dazu, dass in zweistelligen Jahren unter 20 als nach dem Jahr 2000 gelesen wird. Das Ausführen desselben Programms führt dann zu unterschiedlichen Ergebnissen, wenn diese Option festgelegt 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-Drucks werden unten angezeigt. Die erste Beobachtung wird nun als im Jahr 2018 statt 1918 vorkommend 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 Datumsangaben sehr bequem. Um beispielsweise das Alter aller Personen am 1. Januar 2000 zu berechnen, verwenden Sie die folgende Konvertierung 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;
Die Ergebnisse des Proc-Drucks sind unten dargestellt. Die Variable AGE2000 enthält nun das Alter in Jahren ab dem 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 nützlicher Funktionen zur Verwendung mit Datumsvariablen. Im Folgenden finden Sie eine Liste einiger dieser Funktionen.
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 proc-Druckergebnisse werden unten angezeigt. Die neuen Variablen enthalten Monat, Tag, Jahr, Wochentag und 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 date9. und mmddyy11.
- Datumsfunktionen können verwendet werden, um Datumswerte aus ihren Komponenten (mdy(m,d,y)) zu erstellen und die Komponenten aus einem Datumswert (month(), day() usw.) zu extrahieren.).
- Die yearcutoff-Option kann verwendet werden, wenn Sie zweistellige Jahre lesen müssen.
Probleme, auf die Sie achten sollten
- Datumsangaben werden in einem Feld gemischt, sodass kein einzelnes Datumsformat sie lesen kann. Lösung: Lesen Sie das Feld als Zeichenfeld, testen Sie die Zeichenfolge und verwenden Sie die Eingabefunktion und das entsprechende Format, um den Wert in die Datumsvariable einzulesen.
- 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 der Standardwert für yearcutoff nicht der Standardwert für die oben erwähnte 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;
enthält.