Articles

Bruke dates / SAS Læringsmoduler

Lese datoer i data

denne modulen viser hvordan du leser datovariabler, bruker datofunksjoner og bruker datovisningsformater i SAS. Du antas å være kjent med datatrinn for å lese data i SAS, og tildelingserklæringer for beregning av nye variabler. Hvis noen av konseptene er helt nye, vil du kanskje se på for mer informasjon nedenfor for veibeskrivelse til andre læringsmoduler. Datafilen som brukes i det første eksemplet presenteres neste.

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

programmet nedenfor leser dataene og oppretter en midlertidig datafil kalt datoer. Vær oppmerksom på at datoene leses i datatrinnet, og format dato11. brukes til å lese 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; 

utdata av proc-utskriften er presentert nedenfor. Sammenlign datoene i dataene med verdiene til bday. Merk At For John datoen er 1 Jan 1960 og verdien for bday er 0. Dette skyldes at datoer lagres internt i SAS som antall dager Fra 1.Januar 1960. Siden Mary ble født før 1960 verdien av bday for henne er negativ (-1635).

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

for å se datoene på en måte som vi forstår at du må formatere utdataene. Vi bruker date9. format for å se datoer i skjemaet ddmmmyyyy. Dette er angitt på en format-setning.

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

her er utdata produsert av proc print setningen ovenfor.

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

la oss se på følgende data. Ved første øyekast ser det ut som datoene er så forskjellige at de ikke kunne leses. De har to ting til felles:

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

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

disse datoene kan leses med samme format, mmddyy11. Et eksempel på bruken av dette formatet i et datatrinn 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;

resultatene av proc-utskriften ovenfor viser at alle datoene er lest riktig.

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

det finnes en rekke formater tilgjengelig for bruk i å lese datoer I SAS. Følgende er et eksempel på noen av disse formatene.

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

Vurder følgende data der rekkefølgen er måned, år og dag.

 7 1948 11 1 1960 110 1970 1512 1971 10 

du kan lese disse dataene med hver del av datoen i en egen variabel som i datatrinnet som 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;

Legg Merke til funksjonen mdy(måned,dag,år) i datatrinnet. Denne funksjonen brukes til å opprette en datoverdi fra de enkelte komponentene. Resultatet av 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

tosifrede datoer

Vurder følgende data, som er de samme som ovenfor, bortsett fra at bare to sifre brukes til å betegne året, og året vises sist.

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

Å Lese dataene er det samme som vi nettopp 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;

resultatene av proc-utskriften 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

tosifrede år fungerer her fordi SAS antar en cutoff (yearcutoff) før hvilken verdi tosifrede år tolkes som år 2000 og over, og etter som de tolkes som 1999 og under. Standard yearcutoff er forskjellig for ULIKE VERSJONER AV SAS:

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

alternativer-setningen i programmet som følger endrer yearcutoff-verdien til 1920. Dette fører til at i tosifrede år lavere enn 20 skal leses som etter år 2000. Kjører det samme programmet vil da gi forskjellige resultater når dette alternativet er satt.

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;

resultatene av proc-utskriften er vist nedenfor. Den første observasjonen er nå lest 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øpte datoer

SAS-datovariabler gjør beregninger som involverer datoer veldig praktiske. Hvis du for eksempel vil beregne alles alder 1. januar 2000, bruker du følgende konvertering i datatrinnet.

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

programmet med denne beregningen i kontekst 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;

resultatene av proc-utskriften er vist nedenfor. Den variable ALDEREN2000 inneholder nå alderen i år per 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 datofunksjoner

det finnes en rekke nyttige funksjoner for bruk med datovariabler. Følgende er en liste over noen av disse funksjonene.

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 bruken av disse funksjonene.

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-utskriftsresultatene er vist nedenfor. De nye variablene inneholder måned, dag, år, ukedag 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

Sammendrag

  • Datoer leses med datoformater, oftest date9. og mmddyy11.
  • Dato funksjoner kan brukes til å lage datoverdier fra sine komponenter(mdy (m,d,y)), og for å trekke ut komponentene fra en datoverdi (måned (), dag (), etc.).
  • yearcutoff-alternativet kan brukes hvis du må lese tosifrede år.

Problemer å se etter

  • Datoer er blandet i et felt slik at ingen enkelt datoformat kan lese Dem. Løsning: Les feltet som et tegnfelt, test strengen, og bruk inndatafunksjonen og riktig format til å lese verdien i datovariabelen.
  • det er ikke noe format som kan lese datoen. Løsning: les datoen som komponenter og bruk en funksjon til å produsere en datoverdi.
  • noen ganger er standard for yearcutoff ikke standard for versjonen av pakken nevnt ovenfor. Løsning: for å bestemme gjeldende innstilling for yearcutoff bare kjøre et program som inneholder PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    dette vil resultere i utgang som inneholder den nåværende verdien av yearcutoff.