Læsning af datoer i data

Dette modul viser, hvordan man læser datovariabler, bruger datofunktioner og bruger datovisningsformater i SAS. Det antages, at du er bekendt med datatrin til læsning af data i SAS og tildelingsangivelser til beregning af nye variabler. Hvis nogle af begreberne er helt nye, kan du kigge på For mere information nedenfor for at finde vejledninger til andre læringsmoduler. Den datafil, der anvendes i det første eksempel, præsenteres som det næste.

John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959

Programmet nedenfor læser dataene og opretter en midlertidig datafil kaldet dates. Bemærk, at datoerne læses i datatrinet, og at formatet date11. anvendes til at læse datoen.

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; 

Opdatet fra proc print vises nedenfor. Sammenlign datoerne i dataene med værdierne i bday. Bemærk, at for John er datoen 1. januar 1960, og værdien for bday er 0. Det skyldes, at datoer gemmes internt i SAS som antallet af dage fra 1. januar 1960. Da Mary blev født før 1960, er værdien af bday for hende negativ (-1635).

OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207

For at kunne se datoerne på en måde, som vi forstår, skal du formatere output. Vi bruger formatet date9. til at se datoer i formen ddmmmyyyy. Dette angives på en formatangivelse.

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

Her er det output, der produceres af proc print-anvisningen ovenfor.

OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959

Lad os se på følgende data. Ved første øjekast ser det ud til, at datoerne er så forskellige, at de ikke kunne læses. De har dog to ting til fælles:

1) de har alle numeriske måneder,
2) de er alle ordnet måned, dag og derefter år.

John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959

Disse datoer kan læses med det samme format, mmddyy11. Her følger et eksempel på brugen af dette format i et datatrin.

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;

Resultaterne af ovenstående proc-udskrift viser, at alle datoerne er læst korrekt.

OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959

Der findes en lang række forskellige formater, der kan bruges til at læse datoer i SAS. Det følgende er et eksempel på nogle af disse formater.

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

Tænk på følgende data, hvor rækkefølgen er måned, år og dag.

 7 1948 11 1 1960 110 1970 1512 1971 10 

Du kan læse disse data med hver del af datoen i en separat variabel som i datatrinet, der følger.

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;

Bemærk funktionen mdy(måned,dag,år) i datatrinet. Denne funktion bruges til at oprette en datoværdi ud fra de enkelte komponenter. Resultatet af proc-udskrivningen følger.

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

To cifrede datoer

Se på følgende data, som er de samme som ovenfor, bortset fra at der kun anvendes to cifre til at angive årstallet, og år vises til sidst.

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

Læsning af dataene er det samme, som vi lige har gjort.

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;

Resultaterne af proc-udskrivningen er vist nedenfor.

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

To cifrede årstal fungerer her, fordi SAS antager en cutoff (yearcutoff), før hvilken værdi to cifrede årstal fortolkes som år 2000 og derover, og efter hvilken værdi de fortolkes som 1999 og derunder. Standard yearcutoff-værdien er forskellig for forskellige versioner af SAS:

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

Med options-erklæringen i det følgende program ændres yearcutoff-værdien til 1920. Dette bevirker, at tocifrede årstal, der er lavere end 20, læses som værende efter år 2000. Kørsel af det samme program vil derefter give forskellige resultater, når denne indstilling er indstillet.

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;

Resultaterne af proc print er vist nedenfor. Den første observation læses nu som værende foregået i 2018 i stedet for 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

Beregninger med forældede datoer

SAS-datovisuelle variabler gør beregninger, der involverer datoer, meget praktiske. Hvis du f.eks. vil beregne alles alder pr. 1. januar 2000, kan du bruge følgende konvertering i datatrinet.

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

Programmet med denne beregning i sammenhæng følger.

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;

Resultaterne af proc printet er vist nedenfor. Variablen AGE2000 indeholder nu alderen i år pr. 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

Andre nyttige datofunktioner

Der findes en række nyttige funktioner til brug med datovariabler. I det følgende er der en liste over nogle af disse funktioner.

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);

Det følgende program demonstrerer brugen af disse funktioner.

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;

Den proc udskriftsresultater er vist nedenfor. De nye variabler indeholder måned, dag, år, ugedag og kvartal.

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

Resumé

  • Datoer læses med datoformater, oftest dato9. og mmddyy11.
  • Datofunktioner kan bruges til at oprette datoværdier fra deres komponenter (mdy(m,d,y)) og til at udtrække komponenterne fra en datoværdi (month(),day(), osv.).
  • Indstillingen yearcutoff kan bruges, hvis du skal læse tocifrede årstal.

Problemer at holde øje med

  • Datoer blandes i et felt, således at intet enkelt datoformat kan læse dem. Løsning: Læs feltet som et tegnfelt, test strengen, og brug inputfunktionen og det passende format til at læse værdien ind i datovisningsvariablen.
  • Der er intet format, der kan læse datoen. Løsning: Læs datoen som komponenter, og brug en funktion til at fremstille en datoværdi.
  • Nogle gange er standardværdien for yearcutoff ikke standardværdien for den version af pakken, der er nævnt ovenfor. Løsning: For at bestemme den aktuelle indstilling for yearcutoff skal du blot køre et program, der indeholder
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    Det vil resultere i et output, der indeholder den aktuelle værdi for yearcutoff.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.