Utilizarea datelor / Sas module de învățare
citirea datelor în date
Acest modul va arăta cum să citiți variabilele de dată, să utilizați funcțiile de dată și să utilizați formatele de afișare a datei în SAS. Se presupune că sunteți familiarizați cu pașii de date pentru citirea datelor în SAS și cu instrucțiunile de atribuire pentru calcularea noilor variabile. Dacă oricare dintre conceptele sunt complet noi, poate doriți să se uite la Pentru mai multe informații de mai jos pentru direcții la alte module de învățare. Fișierul de date utilizat în primul exemplu este prezentat în continuare.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
programul de mai jos citește datele și creează un fișier de date temporar numit date. Rețineți că datele sunt citite în etapa de date și formatul date11. este folosit pentru a citi data.
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;
rezultatul imprimării proc este prezentat mai jos. Comparați datele din date cu valorile bday. Rețineți că pentru John data este 1 ianuarie 1960, iar valoarea pentru bday este 0. Acest lucru se datorează faptului că datele sunt stocate intern în SAS ca numărul de zile de la Jan 1,1960. Din moment ce Maria sa născut înainte de 1960 valoarea bday pentru ea este negativă (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
pentru a vedea datele într-un mod pe care îl înțelegem, ar trebui să formatați ieșirea. Folosim data9. format pentru a vedea datele în formularul ddmmmyyyy. Acest lucru este specificat într-o declarație de format.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
aici este rezultatul produs de declarația de imprimare proc de mai sus.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
să ne uităm la următoarele date. La prima vedere se pare că datele sunt atât de diferite încât nu au putut fi citite. Au două lucruri în comun:
1) toate au Luni numerice,
2) toate sunt ordonate Lună, Zi și apoi an.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
aceste date pot fi citite cu același format, mmddyy11. Urmează un exemplu de utilizare a acelui format într-un pas de date.
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;
rezultatele tipăririi proc de mai sus arată că toate datele sunt citite corect.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
există o mare varietate de formate disponibile pentru a fi utilizate în citirea datelor în SAS. Următorul este un eșantion de unele dintre aceste 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
luați în considerare următoarele date în care ordinea este luna, anul și ziua.
7 1948 11 1 1960 110 1970 1512 1971 10
puteți citi aceste date cu fiecare porțiune a datei într-o variabilă separată ca în pasul de date care urmează.
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;
observați funcția mdy(Lună,Zi,An) în etapa de date. Această funcție este utilizată pentru a crea o valoare de dată din componentele individuale. Rezultatul tipăririi proc urmează.
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
date din două cifre
luați în considerare următoarele date, care sunt aceleași ca mai sus, cu excepția faptului că numai două cifre sunt folosite pentru a semnifica anul, iar anul apare ultimul.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
citirea datelor este aceeași ca și noi.
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;
rezultatele imprimării proc sunt prezentate mai jos.
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
doi ani cifre de lucru aici, deoarece SAS presupune un cutoff (yearcutoff) înainte de care valoarea doi ani cifre sunt interpretate ca anul 2000 și mai sus și după care acestea sunt interpretate ca 1999 și mai jos. Yearcutoff-ul implicit diferă pentru diferite versiuni ale SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
instrucțiunea de opțiuni din programul care urmează modifică valoarea yearcutoff la 1920. Acest lucru face ca în doi ani cifre mai mici de 20 să fie citite ca după anul 2000. Rularea aceluiași program va produce rezultate diferite atunci când această opțiune este setată.
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;
rezultatele imprimării proc sunt prezentate mai jos. Prima observație este acum citită ca având loc în 2018 în loc 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
calculele cu datele scurse
variabilele de date SAS fac calculele care implică date foarte convenabile. De exemplu, pentru a calcula vârsta fiecăruia la 1 ianuarie 2000, utilizați următoarea conversie în etapa de date.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
programul cu acest calcul în context urmează.
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;
rezultatele imprimării proc sunt prezentate mai jos. Variabila AGE2000 conține acum vârsta în ani de la 1 ianuarie 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
alte funcții utile de dată
există o serie de funcții utile pentru utilizarea cu variabile de dată. Următoarea este o listă a unora dintre aceste funcții.
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);
următorul program demonstrează utilizarea acestor funcții.
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;
rezultatele de imprimare proc sunt prezentate mai jos. Noile variabile conțin luna, ziua, anul, ziua săptămânii și trimestrul.
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
rezumat
- datele sunt citite cu formate de dată, cel mai frecvent date9. și mmddyy11.
- funcțiile de dată pot fi utilizate pentru a crea valori de dată din componentele lor (mdy(m,d,y)) și pentru a extrage componentele dintr-o valoare de dată (lună (), zi () etc.).
- opțiunea yearcutoff poate fi utilizată dacă trebuie să citiți doi ani cifre.
probleme să se uite pentru
- datele sunt amestecate într-un câmp, astfel încât nici un format de dată unică le poate citi. Soluție: citiți câmpul ca câmp de caractere, testați șirul și utilizați funcția de intrare și formatul adecvat pentru a citi valoarea în variabila de dată.
- nu există un format capabil să citească data. Soluție: citiți data ca componente și utilizați o funcție pentru a produce o valoare de dată.
- uneori implicit pentru yearcutoff nu este implicit pentru versiunea pachetului menționat mai sus. Soluție: pentru a determina setarea curentă pentru yearcutoff pur și simplu rulați un program care conține opțiuni PROC OPTION=YEARCUTOFF; RUN;
acest lucru va duce la ieșire care conține valoarea curentă a yearcutoff.