Čtení dat v datech

Tento modul ukáže, jak číst proměnné s datem, používat funkce data a formáty zobrazení data v SAS. Předpokládá se, že znáte datové kroky pro načítání dat do SASu a přiřazovací příkazy pro výpočet nových proměnných. Pokud je pro vás některý z konceptů zcela nový, můžete se podívat na níže uvedené Další informace, kde najdete pokyny k dalším výukovým modulům. Dále je uveden datový soubor použitý v prvním příkladu.

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

Následující program načte data a vytvoří dočasný datový soubor s názvem data. Všimněte si, že data jsou načtena v kroku data a pro načtení data je použit formát date11.

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; 

Níže je uveden výstup programu proc print. Porovnejte data v datech s hodnotami bday. Všimněte si, že pro Johna je datum 1. ledna 1960 a hodnota pro bday je 0. Je to proto, že data jsou v SASu interně uložena jako počet dní od 1. ledna 1960. Protože se Marie narodila před rokem 1960, je hodnota bday pro ni záporná (-1635).

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

Pro zobrazení dat způsobem, kterému rozumíme, byste museli výstup formátovat. Pro zobrazení dat ve tvaru ddmmmyyyy používáme formát date9. Ten se zadává ve formátovacím příkazu.

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

Tady je výstup vytvořený výše uvedeným příkazem proc print.

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

Podívejme se na následující data. Na první pohled to vypadá, že data jsou natolik odlišná, že je nelze přečíst. Mají však dvě společné věci:

1) všechny mají číselné označení měsíce,
2) všechny jsou seřazeny měsíc, den a pak rok.

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

Tyto data lze číst ve stejném formátu, mmddyy11. Následuje příklad použití tohoto formátu v datovém kroku.

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;

Výsledky výše uvedeného tisku proc ukazují, že všechna data jsou načtena správně.

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

Při načítání dat do SAS je k dispozici celá řada formátů. Následuje ukázka některých z těchto formátů.

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

Podívejte se na následující data, ve kterých je pořadí měsíc, rok a den.

 7 1948 11 1 1960 110 1970 1512 1971 10 

Tato data můžete načíst s každou částí data v samostatné proměnné jako v následujícím datovém kroku.

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;

Všimněte si funkce mdy(měsíc,den,rok) v datovém kroku. Tato funkce slouží k vytvoření hodnoty data z jednotlivých složek. Následuje výsledek tisku proc.

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

Dvoumístná data

Podívejte se na následující data, která jsou stejná jako výše uvedená s tím rozdílem, že pro označení roku jsou použity pouze dvě číslice a rok se objevuje jako poslední.

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

Čtení dat je stejné jako před chvílí.

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;

Výsledky tisku proc jsou uvedeny níže.

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

Dvoumístné roky zde fungují, protože SAS předpokládá mezní hodnotu (yearcutoff), před kterou jsou dvoumístné roky interpretovány jako rok 2000 a vyšší a po které jsou interpretovány jako rok 1999 a nižší. Výchozí hodnota yearcutoff se pro různé verze SAS liší:

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

Příkaz options v následujícím programu mění hodnotu yearcutoff na 1920. To způsobí, že ve dvouciferných letech nižších než 20 se budou číst jako roky po roce 2000. Spuštění stejného programu pak při nastavení této volby přinese odlišné výsledky.

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;

Výsledky tisku proc jsou uvedeny níže. První pozorování je nyní čteno jako pozorování, které se vyskytlo v roce 2018 místo v roce 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

Výpočty s uplynulými daty

Proměnné data systému SAS umožňují velmi pohodlné výpočty zahrnující data. Chcete-li například vypočítat věk každého člověka k 1. lednu 2000, použijte v datovém kroku následující převod.

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

Program s tímto výpočtem v kontextu následuje.

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;

Výsledky tisku proc jsou uvedeny níže. Proměnná AGE2000 nyní obsahuje věk v letech k 1. lednu 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

Další užitečné funkce pro práci s daty

Existuje řada užitečných funkcí pro práci s proměnnými s daty. Následuje seznam některých z těchto funkcí.

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);

Následující program demonstruje použití těchto funkcí.

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;

Výsledky tisku proc jsou uvedeny níže. Nové proměnné obsahují měsíc, den, rok, den v týdnu a čtvrtletí.

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

Souhrn

  • Data se načítají pomocí formátů data, nejčastěji date9. a mmddyy11.
  • Datové funkce lze použít k vytvoření hodnot data z jejich složek (mdy(m,d,y)) a k extrakci složek z hodnoty data (month(),day() atd.).
  • Volbu yearcutoff lze použít, pokud je třeba číst dvoumístné roky.

Problémy, na které je třeba si dát pozor

  • Data jsou v rámci pole smíchána tak, že je nedokáže přečíst žádný formát data. Řešení: Přečtěte pole jako znakové pole, otestujte řetězec a pomocí vstupní funkce a vhodného formátu načtěte hodnotu do proměnné datum.
  • Neexistuje žádný formát, který by byl schopen datum přečíst. Řešení: Načtěte datum jako komponenty a pomocí funkce vytvořte hodnotu data.
  • Někdy není výchozí hodnota pro yearcutoff výchozí hodnotou pro výše uvedenou verzi balíčku. Řešení: Pro zjištění aktuálního nastavení pro yearcutoff stačí spustit program obsahující
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    Výsledkem bude výstup obsahující aktuální hodnotu yearcutoff.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.