Articles

Dátumok | SAS tanulási modulok használata

dátumok olvasása az adatokban

Ez a modul megmutatja, hogyan kell olvasni a dátumváltozókat, használni a dátumfüggvényeket és használni a dátummegjelenítési formátumokat a SAS-ban. Feltételezzük, hogy ismeri az adatok SAS-ba történő olvasásához szükséges adatlépéseket, valamint 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, érdemes az alábbiakban további információkat keresni a többi tanulási modulhoz vezető útmutatásokról. Az első példában használt adatfájl a következő.

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, a dates nevet. Vegye figyelembe, hogy a dátumok az adat lépésben olvashatók, a formátum pedig a dátum11. a dátum olvasására szolgál.

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 nyomtatás kimenete az alábbiakban látható. Hasonlítsa össze az adatok dátumait a bday értékeivel. Vegye figyelembe, hogy John esetében a dátum 1 Jan 1960, a bday értéke pedig 0. Ez azért van, mert a dátumokat a SAS-ban belül tárolják, mint a Jan 1,1960 napok számát. Mivel Mária 1960 előtt született, a bday értéke negatív (-1635).

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

annak érdekében, hogy a dátumokat Úgy lássuk, hogy megértsük, meg kell formáznia a kimenetet. A date9-et használjuk. formátum a dátumok megtekintéséhez a ddmmmyyyy formában. Ez egy format utasításban van megadva.

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

itt látható a fenti proc print utasítás kimenete.

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, hogy a dátumok annyira különböznek egymástól, hogy nem lehetett őket elolvasni. Két közös dolog van bennük:

1) mindegyiknek numerikus hónapja van,
2) mindegyik hónap, nap, majd év.

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

ezek a dátumok ugyanolyan formátumban olvashatók, mmddyy11. A következő példa a formátum használatára egy adatlépésben.

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átumot helyesen olvasta.

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

sokféle formátum áll rendelkezésre a dátumok SAS-ba történő olvasásához. Az alábbiakban bemutatunk néhány ilyen formátumot.

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

vegye figyelembe a következő adatokat, amelyekben a sorrend hónap, év és nap.

 7 1948 11 1 1960 110 1970 1512 1971 10 

ezeket az adatokat a dátum minden egyes részével külön változóban olvashatja el, mint az alábbi 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;

figyelje meg az mdy(hónap,nap,év) funkciót az adatlépésben. Ez a függvény dátumérték létrehozására szolgál az egyes összetevőkből. A proc nyomtatás 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átumok

vegye figyelembe a következő adatokat, amelyek megegyeznek a fentiekkel, azzal a különbséggel, hogy csak két számjegyet használnak az év jelölésére, és az év utoljára jelenik meg.

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

Az adatok olvasása ugyanaz, mint az imént.

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 nyomtatás eredményei az alábbiakban láthatók.

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

két számjegyű év működik itt, mert a SAS feltételez egy küszöbértéket (yearcutoff), amely előtt a két számjegyű éveket 2000-es vagy annál magasabb évként, majd 1999-es vagy annál alacsonyabb értékként értelmezik. 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ő program options utasítása a yearcutoff értéket 1920-ra változtatja. Ez azt eredményezi, hogy a 20-nál alacsonyabb két számjegyű években a 2000-es év után kell olvasni. Ha ugyanazt a programot futtatja, akkor különböző eredményeket fog elérni, 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 nyomtatás eredményei alább láthatók. Az első megfigyelés most úgy olvasható, hogy 2018-ban történt, nem pedig 1918-ban.

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ói nagyon kényelmessé teszik a dátumokat tartalmazó számításokat. Például, hogy kiszámítja mindenki életkora január 1, 2000 használja a következő átalakítás az adatok lépésben.

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

a program ezzel a számítással összefüggésben következik.

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 nyomtatás eredményei az alábbiakban láthatók. A változó AGE2000 most tartalmazza a kor év január 1, 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

egyéb hasznos Dátumfüggvények

számos hasznos funkció használható a dátumváltozókkal. Az alábbiakban felsorolunk néhány ilyen funkciót.

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 bemutatja ezeknek a funkcióknak a használatát.

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ények alább láthatók. Az új változók tartalmazzák a hónap, nap, év, nap a hét és negyedév.

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átumok dátumformátumokkal olvashatók, leggyakrabban date9. és mmdyy11.
  • a Dátumfüggvények felhasználhatók dátumértékek létrehozására az összetevőkből (mdy(m,d,y)), valamint az összetevők kibontására egy dátumértékből (hónap(),nap () stb.).
  • a yearcutoff opció használható, ha két számjegyű évet kell olvasnia.

problémák, amelyekre figyelni kell

  • a dátumok egy mezőn belül keverednek, így egyetlen dátumformátum sem tudja elolvasni őket. Megoldás: olvassa el a mezőt karaktermezőként, tesztelje a karakterláncot, és használja a bemeneti funkciót és a megfelelő formátumot az érték beolvasásához a dátumváltozóba.
  • nincs formátum, amely képes olvasni a dátumot. Megoldás: olvassa el a dátumot összetevőként, és használjon függvényt a dátumérték előállításához.
  • néha az alapértelmezett yearcutoff nem az alapértelmezett a verzió a csomag fent említett. Megoldás: a yearcutoff aktuális beállításának meghatározásához egyszerűen futtasson egy programot, amely tartalmazza
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    Ez azt eredményezi, hogy a kimenet tartalmazza a yearcutoff aktuális értékét.