Dátumok olvasása az adatokban
Ez a modul bemutatja, hogyan olvashatunk dátumváltozókat, használhatunk dátumfüggvényeket és használhatunk dátummegjelenítési formátumokat a SAS-ban. Feltételezzük, hogy ismeri az adatok SAS-ba történő beolvasásához szükséges adatlépéseket és az új változók kiszámításához szükséges hozzárendelési utasításokat. Ha bármelyik fogalom teljesen új, akkor érdemes megnézni a További információk alább található, más tanulási modulokhoz vezető útvonalakat. A következőkben az első példában használt adatfájlt mutatjuk be.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
Az alábbi program beolvassa az adatokat, és létrehoz egy ideiglenes adatfájlt dátumok néven. Vegyük észre, hogy a dátumok beolvasása az adatlépésben történik, és a dátum beolvasásához a date11. formátumot használjuk.
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;
A proc print kimenete az alábbiakban látható. Hasonlítsa össze az adatokban szereplő dátumokat a bday értékeivel. Vegyük észre, hogy John esetében a dátum 1960. január 1., a bday értéke pedig 0. Ez azért van, mert a dátumokat a SAS belsőleg az 1960. január 1-től számított napok számaként tárolja. Mivel Mary 1960 előtt született, a bday értéke nála negatív (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
Hogy a dátumokat számunkra érthető módon láthassuk, a kimenetet meg kell formáznunk. A dátum9. formátumot használjuk, hogy a dátumokat ddmmmyyyyyy formában lássuk. Ezt egy formátum utasításon adjuk meg.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Íme a fenti proc print utasítás által előállított kimenet.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
Nézzük meg a következő adatokat. Első pillantásra úgy tűnik, mintha a dátumok annyira eltérőek lennének, hogy nem lehetne kiolvasni őket. Két dolog közös bennük:
1) mindegyikben numerikus hónapok vannak,
2) mindegyikben hónap, nap, majd év a sorrend.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
Ezek a dátumok ugyanabban a formátumban olvashatók, mmddyy11. Egy példa ennek a formátumnak az adatlépésben való használatára következik.
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;
A fenti proc nyomtatás eredményei azt mutatják, hogy az összes dátum helyesen olvasható.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
A dátumok SAS-ba történő beolvasásához sokféle formátum áll rendelkezésre. Az alábbiakban néhány ilyen formátumot mutatunk be.
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
Lássuk a következő adatokat, amelyekben a sorrend a hónap, az év és a nap.
7 1948 11 1 1960 110 1970 1512 1971 10
Elolvashatja ezeket az adatokat úgy, hogy a dátum minden egyes része külön változóban van, mint a következő adatlépésben.
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;
Figyeljünk az adatlépésben szereplő mdy(hónap,nap,év) függvényre. Ez a függvény arra szolgál, hogy az egyes összetevőkből egy dátumértéket hozzon létre. A proc print eredménye következik.
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
Két számjegyű dátum
Nézzük meg a következő adatokat, amelyek megegyeznek a fentiekkel, kivéve, hogy csak két számjegyet használunk az év jelölésére, és az év utolsó helyen szerepel.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
Az adatok beolvasása ugyanúgy történik, mint az előbb.
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;
A proc print eredménye az alábbiakban látható.
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
A kétjegyű évek itt azért működnek, mert a SAS feltételez egy határértéket (yearcutoff), amely előtt a kétjegyű évszámokat 2000-es vagy annál magasabb értékként, utána pedig 1999-es vagy annál alacsonyabb értékként értelmezi. Az alapértelmezett yearcutoff a SAS különböző verzióinál eltérő:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
A következő programban szereplő options utasítás az yearcutoff értékét 1920-ra változtatja. Ez azt eredményezi, hogy a 20-nál alacsonyabb két számjegyű évszámokat 2000 utáni évnek olvassa. Ugyanennek a programnak a futtatása ezután más eredményt ad, ha ez az opció be van állítva.
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;
A proc print eredményei az alábbiakban láthatók. Az első megfigyelést most 1918 helyett 2018-ban történtnek olvassuk.
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
Az eltelt dátumokkal végzett számítások
A SAS dátumváltozók nagyon kényelmessé teszik a dátumokkal végzett számításokat. Például mindenki 2000. január 1-jei életkorának kiszámításához használja a következő átalakítást az adatlépésben.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
A program ezzel a számítással összefüggésben a következő.
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;
A proc print eredménye az alábbiakban látható. Az AGE2000 változó most már a 2000. január 1-jei életkort tartalmazza években kifejezve.
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
Más hasznos dátumfüggvények
Számos hasznos függvény létezik a dátumváltozókkal való használatra. Az alábbiakban felsorolunk néhányat ezek közül a függvények közül.
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);
A következő program ezeknek a függvényeknek a használatát mutatja be.
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;
A proc nyomtatási eredményei az alábbiakban láthatók. Az új változók tartalmazzák a hónapot, a napot, az évet, a hét napját és a negyedévet.
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
Összefoglaló
- A dátumokat dátumformátumokkal olvassa, leggyakrabban date9. és mmddyy11.
- A dátumfüggvények segítségével létrehozhatunk dátumértékeket azok összetevőiből (mdy(m,d,y)), és kivonhatjuk az összetevőket egy dátumértékből (month(),day() stb.).
- Az yearcutoff opció akkor használható, ha kétjegyű évszámokat kell beolvasni.
Problémák, amelyekre figyelni kell
- A dátumok egy mezőn belül úgy keverednek, hogy egyetlen dátumformátum sem tudja beolvasni őket. Megoldás: Olvassa be a mezőt karakteres mezőként, tesztelje a karakterláncot, majd a beviteli függvény és a megfelelő formátum segítségével olvassa be az értéket a dátumváltozóba.
- Nincs olyan formátum, amely képes lenne beolvasni a dátumot. Megoldás: Olvassa be a dátumot összetevőként, és egy függvény segítségével állítson elő dátumértéket.
- Előfordul, hogy a yearcutoff alapértelmezett értéke nem a csomag fent említett verziójának alapértelmezett értéke. Megoldás: A yearcutoff aktuális beállításának meghatározásához egyszerűen futtasson egy
PROC OPTIONS OPTION=YEARCUTOFF; RUN;
Ez a yearcutoff aktuális értékét tartalmazó programot.