Brug af datoer / SAS læringsmoduler
læsning af datoer i data
Dette modul viser, hvordan man læser datovariabler, bruger datofunktioner og bruger datovisningsformater i SAS. Du antages at være bekendt med datatrin til læsning af data i SAS og tildelingsopgørelser til beregning af nye variabler. Hvis nogen af koncepterne er helt nye, kan du se på for mere information nedenfor for at få vejledning til andre læringsmoduler. Den datafil, der bruges i det første eksempel, præsenteres 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 datoer. Bemærk, at datoerne læses i datatrinnet og formatet dato11. bruges 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;
udgangen af proc print er præsenteret nedenfor. Sammenlign datoerne i dataene med værdierne for bday. Bemærk, at for John datoen er 1 Jan 1960 og værdien for bday er 0. Dette skyldes, at datoer gemmes internt i SAS som antallet af dage fra 1.1960. Januar. Siden Mary blev født før 1960 værdien af bday for hende er negativ (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
for at se datoerne på en måde, som vi forstår, skal du formatere output. Vi bruger dato9. format for at se datoer i formularen ddmmmyyyy. Dette er angivet i en formaterklæring.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Her er output produceret af proc print statement 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 to ting til fælles:
1) de har alle numeriske måneder,
2) de er alle bestilt 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 samme format, mmddyy11. Et eksempel på brugen af dette format i et datatrin følger.
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-udskrivning viser, at alle datoer læses korrekt.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
Der er en bred vifte af formater til rådighed til brug ved læsning af datoer i SAS. 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
overvej følgende data, hvor ordren 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 datatrinnet, 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 datatrinnet. Denne funktion bruges til at oprette en datoværdi ud fra de enkelte komponenter. Resultatet af proc print 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
tocifrede datoer
overvej følgende data, som er de samme som ovenfor, bortset fra at kun to cifre bruges til at betegne året, og året vises sidst.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
læsning af dataene er det samme som vi lige gjorde.
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.
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
tocifrede år arbejder her, fordi SAS antager en cutoff (yearcutoff), før hvilken værdi tocifrede år fortolkes som året 2000 og derover, og hvorefter de fortolkes som 1999 og nedenfor. Standard yearcutoff adskiller sig for forskellige versioner af SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
optionsopgørelsen i programmet, der følger, ændrer yearcutoff-værdien til 1920. Dette medfører, at i tocifrede år lavere end 20 læses som efter år 2000. At køre det samme program giver derefter 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 forekommende 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 forløbne datoer
SAS datovariabler gør beregninger, der involverer datoer, meget praktiske. For eksempel at beregne alles alder den 1. januar 2000 skal du bruge følgende konvertering i datatrinnet.
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 print er vist nedenfor. Variablen AGE2000 indeholder nu alderen i år fra 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 er en række nyttige funktioner til brug med datovariabler. Følgende er 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);
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;
proc-udskrivningsresultaterne vises 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
oversigt
- datoer læses med datoformater, oftest dato9. og mmddyy11.
- Datofunktioner kan bruges til at oprette datoværdier ud fra deres komponenter (mdy(m,d,y)) og til at udtrække komponenterne fra en datoværdi (Måned (), Dag () osv.).
- indstillingen yearcutoff kan bruges, hvis du skal læse tocifrede år.
problemer at passe på
- datoer blandes inden for et felt, så 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 i datovariablen.
- Der er ikke noget format, der kan læse datoen. Løsning: Læs datoen som komponenter, og brug en funktion til at producere en datoværdi.
- nogle gange er standard for yearcutoff ikke standard 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;
dette vil resultere i output, der indeholder den aktuelle værdi af yearcutoff.