Citerea datelor în date

Acest modul va arăta cum se citesc variabilele de date, cum se utilizează funcțiile de date și cum se utilizează formatele de afișare a datelor în SAS. Se presupune că sunteți familiarizat cu pașii de date pentru citirea datelor în SAS și cu declarațiile de atribuire pentru calcularea de noi variabile. Dacă vreunul dintre concepte este complet nou, este posibil să doriți să vă uitați la secțiunea Pentru mai multe informații de mai jos pentru direcții către 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 dates. Rețineți că datele sunt citite în etapa de date, iar formatul date11. este utilizat 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; 

Izvorul de ieșire al proc print este prezentat mai jos. Comparați datele din date cu valorile din bday. Observați că, pentru John, data este 1 ian. 1960, iar valoarea pentru bday este 0. Acest lucru se datorează faptului că datele sunt stocate intern în SAS ca număr de zile de la 1 ian. 1960. Deoarece Mary s-a născut înainte de 1960, valoarea lui 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 să-l înțelegem ar trebui să formatați ieșirea. Noi folosim formatul date9. pentru a vedea datele sub forma ddmmmyyyy. Acesta este specificat într-o instrucțiune de format.

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

Iată rezultatul produs de instrucțiunea proc print 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 pot fi citite. Ele au totuși 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 acestui 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 imprimării 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 la citirea datelor în SAS. Următorul este un exemplu al unora 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

Considerați 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 de dată î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(month,day,year) din pasul de date. Această funcție este utilizată pentru a crea o valoare de dată din componentele individuale. Rezultatul imprimării proc este următorul.

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

Considerați următoarele date, care sunt identice cu cele de mai sus, cu excepția faptului că se folosesc doar două cifre pentru a semnifica anul, iar anul apare ultimul.

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

Citerea datelor se face la fel ca cea pe care tocmai am făcut-o.

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 proc print 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

Anii cu două cifre funcționează aici pentru că SAS presupune un cuttoff (yearcutoff) înainte de a cărui valoare anii cu două cifre sunt interpretați ca fiind anul 2000 și mai sus și după care sunt interpretați ca fiind 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)

Declarația options din programul care urmează modifică valoarea yearcutoff la 1920. Acest lucru face ca în anii cu două cifre mai mici decât 20 să fie citiți ca fiind după anul 2000. Rularea aceluiași program va da apoi 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 proc print sunt prezentate mai jos. Prima observație este citită acum 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 date scurse

Variabilele de dată SAS fac foarte convenabile calculele care implică date. 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 din proc print sunt prezentate mai jos. Variabila AGE2000 conține acum vârsta în ani la data de 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 pentru date

Există o serie de funcții utile pentru a fi utilizate cu variabilele de date. 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);

Programul următor 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 imprimării 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

Summary

  • Datele sunt citite cu formate de date, cel mai frecvent date9. și mmddyy11.
  • Funcțiile de date pot fi utilizate pentru a crea valori de date din componentele lor (mdy(m,d,y)) și pentru a extrage componentele dintr-o valoare de dată (month(),day(), etc.).
  • Opțiunea yearcutoff poate fi utilizată în cazul în care trebuie să citiți ani cu două cifre.

Probleme la care trebuie să fiți atenți

  • Datele sunt amestecate în cadrul unui câmp astfel încât niciun format de dată nu le poate citi. Soluție: Citiți câmpul ca un câmp de caractere, testați șirul de caractere și utilizați funcția de intrare și formatul corespunzător pentru a citi valoarea în variabila dată.
  • Nu există niciun format capabil să citească data. Soluție: Citiți data ca și componente și utilizați o funcție pentru a produce o valoare de dată.
  • Uneori, valoarea implicită pentru yearcutoff nu este cea implicită pentru versiunea de pachet menționată mai sus. Soluție: pentru a determina setarea curentă pentru yearcutoff pur și simplu rulați un program care conține
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    Aceasta va avea ca rezultat o ieșire care va conține valoarea curentă a lui yearcutoff.

Lasă un răspuns

Adresa ta de email nu va fi publicată.