Läsning av datum i data
Denna modul visar hur man läser datumvariabler, använder datumfunktioner och använder datumformat i SAS. Du förutsätts vara bekant med datasteg för att läsa in data i SAS och tilldelningsinstruktioner för att beräkna nya variabler. Om något av begreppen är helt nytt kan du titta på För mer information nedan för anvisningar till andra inlärningsmoduler. Datafilen som används i det första exemplet presenteras härnäst.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
Programmet nedan läser in data och skapar en temporär datafil med namnet dates. Observera att datumen läses i datasteget och att 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;
Utmatningen av proc print presenteras nedan. Jämför datumen i data med värdena i 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. Eftersom Mary föddes före 1960 är värdet för 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 utdata. Vi använder formatet date9. för att se datum i formen ddmmmyyyy. Detta anges i ett formatmeddelande.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Här är den utdata som produceras av proc print-anvisningen ovan.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
Vi tittar på följande data. Vid första anblicken ser det ut som om datumen är så olika att de inte kan läsas. De har dock två saker gemensamt:
1) alla har numeriska månader,
2) alla är ordnade 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. Nedan följer ett exempel på användningen av detta format i ett datasteg.
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 som kan användas för att läsa 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
Observera 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;
Bemärk 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 nedan.
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
Konsultera följande data, som är desamma som ovan förutom att endast två siffror används för att beteckna året, och år visas sist.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
Läsningen av data är densamma 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 print 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 utgår från en brytpunkt (yearcutoff) före vilken värde tvåsiffriga år tolkas som år 2000 och högre och efter vilken de tolkas som 1999 och lägre. Standardvärdet för yearcutoff skiljer sig åt för olika versioner av SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
Optioner-angivelsen i programmet som följer ändrar yearcutoff-värdet till 1920. Detta gör att tvåsiffriga årtal som är lägre än 20 läses som efter år 2000. Att köra samma program kommer sedan att ge olika resultat när detta alternativ ä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 print visas nedan. Den första observationen läses nu som inträffad 2018 i stä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 med datum mycket praktiska. Om du till exempel vill beräkna allas ålder den 1 januari 2000 kan du använda följande omvandling i datasteget.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
Programmet med denna beräkning i sammanhanget 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 print visas nedan. Variabeln AGE2000 innehåller nu åldern i år från och med den 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 förteckning ö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 demonstrerar 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;
Resultaten av proc print 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 datum9. och mmddyy11.
- Datumfunktioner kan användas för att skapa datumvärden från deras komponenter (mdy(m,d,y)) och för att extrahera komponenterna från ett datumvärde (month(),day() osv.).
- Alternativet yearcutoff kan användas om du måste läsa tvåsiffriga årtal.
Problem att se upp för
- Datum blandas inom ett fält så att inget enskilt 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 in 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 ta fram ett datumvärde.
- Ibland är standardvärdet för yearcutoff inte standardvärdet för den version av paketet som nämns ovan. Lösning: För att bestämma den aktuella inställningen för yearcutoff kör du helt enkelt ett program som innehåller
PROC OPTIONS OPTION=YEARCUTOFF; RUN;
Detta kommer att resultera i en utskrift som innehåller det aktuella värdet för yearcutoff.