Använda datum / SAS Inlärningsmoduler
läsa datum i data
den här modulen visar hur man läser datumvariabler, använder datumfunktioner och använder datumvisningsformat i SAS. Du antas vara bekant med datasteg för att läsa data i SAS och tilldelningsuttalanden för att beräkna nya variabler. Om något av koncepten är helt nytt, kanske du vill titta på för mer information nedan för vägbeskrivning till andra inlärningsmoduler. Datafilen som används i det första exemplet presenteras nästa.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
programmet nedan läser data och skapar en tillfällig datafil som heter datum. Observera att datumen läses i datasteget och formatet date11. används för att läsa datumet.
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;
utgången från proc-utskriften presenteras nedan. Jämför datumen i data med värdena för bday. Observera att för John är datumet 1 Jan 1960 och värdet för bday är 0. Detta beror på att datum lagras internt i SAS som antalet dagar från 1 Jan 1960. Sedan Mary föddes före 1960 är värdet av bday för henne negativt (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
för att se datumen på ett sätt som vi förstår måste du formatera utmatningen. Vi använder date9. format för att se datum i formuläret ddmmmyyyy. Detta anges i ett formatuttalande.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
här är utgången som produceras av proc-utskriftssatsen ovan.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
låt oss titta på följande data. Vid första anblicken ser det ut som datumen är så olika att de inte kunde läsas. De har två saker gemensamt:
1) de har alla numeriska månader,
2) de är alla beställda månad, dag och sedan år.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
dessa datum kan läsas med samma format, mmddyy11. Ett exempel på användningen av det formatet i ett datasteg följer.
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;
resultaten av ovanstående proc-utskrift visar att alla datum läses korrekt.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
det finns en mängd olika format tillgängliga för användning vid läsning av datum i SAS. Följande är ett exempel på några av dessa format.
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öljande data där ordningen är månad, år och dag.
7 1948 11 1 1960 110 1970 1512 1971 10
Du kan läsa dessa data med varje del av datumet i en separat variabel som i datasteget som följer.
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;
Lägg märke till funktionen mdy(månad,dag,år) i datasteget. Denna funktion används för att skapa ett datumvärde från de enskilda komponenterna. Resultatet av proc-utskriften följer.
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
tvåsiffriga datum
Tänk på följande data, som är desamma som ovan förutom att endast två siffror används för att beteckna året och året visas sist.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
att läsa data är detsamma som vi just 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;
resultaten av proc-utskriften visas nedan.
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
tvåsiffriga år fungerar här eftersom SAS antar en cutoff (yearcutoff) före vilket värde tvåsiffriga år tolkas som år 2000 och senare och varefter de tolkas som 1999 och nedan. Standard yearcutoff skiljer sig åt för olika versioner av SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
alternativsatsen i programmet som följer ändrar yearcutoff-värdet till 1920. Detta orsakar i tvåsiffriga år lägre än 20 att läsas som efter år 2000. Att köra samma program ger då olika resultat när det här alternativet är inställt.
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;
resultaten av proc-utskriften visas nedan. Den första observationen läses nu som inträffar 2018 istället för 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
beräkningar med förflutna datum
SAS datumvariabler gör beräkningar som involverar datum mycket praktiska. Om du till exempel vill beräkna allas ålder den 1 januari 2000 använder du följande konvertering i datasteget.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
programmet med denna beräkning i sammanhang följer.
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;
resultaten av proc-utskriften visas nedan. Den variabla ÅLDERN2000 innehåller nu åldern i år från och med 1 januari 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
andra användbara datumfunktioner
det finns ett antal användbara funktioner för användning med datumvariabler. Nedan följer en lista över några av dessa 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öljande program visar användningen av dessa 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-utskriftsresultaten visas nedan. De nya variablerna innehåller månad, dag, år, veckodag och 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
sammanfattning
- datum läses med datumformat, oftast date9. och mmddyy11.
- datumfunktioner kan användas för att skapa datumvärden från sina komponenter(mdy (m,d,y)) och för att extrahera komponenterna från ett datumvärde (månad (), dag (), etc.).
- alternativet yearcutoff kan användas om du måste läsa tvåsiffriga år.
problem att hålla utkik efter
- datum blandas i ett fält så att inget enda datumformat kan läsa dem. Lösning: Läs fältet som ett teckenfält, testa strängen och använd inmatningsfunktionen och lämpligt format för att läsa värdet i datumvariabeln.
- Det finns inget format som kan läsa datumet. Lösning: läs datumet som komponenter och använd en funktion för att skapa ett datumvärde.
- ibland är standard för yearcutoff inte standard för den version av paketet som nämns ovan. Lösning: för att bestämma den aktuella inställningen för yearcutoff helt enkelt köra ett program som innehåller
proc OPTIONS OPTION=YEARCUTOFF; RUN;
detta kommer att resultera i utdata som innehåller det aktuella värdet av yearcutoff.