Articles

Korzystanie z modułów szkoleniowych dates | SAS

Czytanie dat w danych

Ten moduł pokaże, jak czytać zmienne daty, używać funkcji daty i używać formatów wyświetlania daty w SAS. Zakłada się, że znasz kroki danych do odczytu danych do SAS i instrukcje przypisania do obliczania nowych zmiennych. Jeśli którekolwiek z pojęć jest całkowicie nowe, możesz zajrzeć poniżej, aby uzyskać więcej informacji na temat innych modułów szkoleniowych. Plik danych zastosowany w pierwszym przykładzie jest przedstawiony dalej.

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

poniższy program odczytuje dane i tworzy tymczasowy plik danych o nazwie dates. Należy pamiętać, że daty są odczytywane w kroku Dane i format data11. służy do odczytu daty.

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; 

wyjście wydruku proc jest przedstawione poniżej. Porównaj daty w danych z wartościami bday. Zauważ, że dla Jana datą jest 1 stycznia 1960, a wartością dla bday jest 0. Dzieje się tak, ponieważ daty są przechowywane wewnętrznie w SAS jako liczba dni od 1 stycznia 1960. Ponieważ Mary urodziła się przed 1960 rokiem, wartość bday dla niej jest ujemna (-1635).

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

aby zobaczyć daty w sposób, który rozumiemy, będziesz musiał sformatować wyjście. Używamy data9. Formatuj, aby zobaczyć daty w postaci ddmmmyyyy. Jest to określone w instrukcji format.

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

oto wyjście wygenerowane przez powyższą instrukcję proc print.

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

spójrzmy na następujące dane. Na pierwszy rzut oka wygląda na to, że daty są tak różne, że nie można ich odczytać. Mają dwie wspólne rzeczy:

1) wszystkie mają numeryczne miesiące,
2) wszystkie są uporządkowane miesiącem, dniem, a następnie rokiem.

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

te daty mogą być odczytywane w tym samym formacie, mmddyy11. Poniżej przedstawiono przykład użycia tego formatu w kroku danych.

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;

wyniki powyższego wydruku proc pokazują, że wszystkie daty są poprawnie odczytane.

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

istnieje wiele różnych formatów dostępnych do wykorzystania w odczycie dat w SAS. Poniżej znajduje się próbka niektórych z tych formatów.

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

weź pod uwagę następujące dane, w których kolejność to miesiąc, rok i dzień.

 7 1948 11 1 1960 110 1970 1512 1971 10 

Możesz odczytać te dane z każdą częścią daty w osobnej zmiennej, jak w następnym kroku danych.

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;

zwróć uwagę na funkcję MDY(Miesiąc,Dzień,Rok) w kroku danych. Funkcja ta służy do utworzenia wartości daty z poszczególnych komponentów. Wynik wydruku proc jest następujący.

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

dwucyfrowe daty

weź pod uwagę następujące dane, które są takie same jak powyżej, z wyjątkiem tego, że tylko dwie cyfry są używane do oznaczenia roku, a rok pojawia się jako ostatni.

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

odczyt danych jest taki sam jak przed chwilą.

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;

poniżej przedstawiono wyniki wydruku proc.

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

dwa lata działają tutaj, ponieważ SAS zakłada odcięcie (yearcutoff), przed którym wartość dwa lata cyfrowe są interpretowane jako Rok 2000 i powyżej, a po którym są interpretowane jako rok 1999 i poniżej. Domyślny yearcutoff różni się dla różnych wersji SAS:

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

Instrukcja options w programie, która następuje zmienia wartość yearcutoff na 1920. Powoduje to, że w dwucyfrowych latach mniej niż 20 należy odczytywać jak po roku 2000. Uruchomienie tego samego programu przyniesie różne wyniki, gdy ta opcja jest ustawiona.

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;

poniżej przedstawiono wyniki wydruku proc. Pierwsza obserwacja jest obecnie odczytywana jako mająca miejsce w 2018 roku, a nie w 1918 roku.

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

obliczenia z upłyniętymi datami

zmienne daty SAS sprawiają, że obliczenia z datami są bardzo wygodne. Na przykład, aby obliczyć wiek każdego dnia 1 stycznia 2000 r., użyj następującej konwersji w kroku danych.

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

następuje program z tymi obliczeniami w kontekście.

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;

poniżej przedstawiono wyniki wydruku proc. Zmienna AGE2000 zawiera obecnie wiek w latach od 1 stycznia 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

inne przydatne funkcje daty

istnieje wiele przydatnych funkcji do użycia ze zmiennymi daty. Poniżej znajduje się lista niektórych z tych funkcji.

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

poniższy program demonstruje użycie tych funkcji.

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;

poniżej przedstawiono wyniki drukowania proc. Nowe zmienne zawierają Miesiąc, Dzień, Rok, Dzień tygodnia i kwartał.

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

podsumowanie

  • daty są odczytywane z formatami dat, najczęściej date9. i mmddyy11.
  • funkcje daty mogą być używane do tworzenia wartości daty z ich komponentów (MDY(m,d,y)) i wyodrębniania komponentów z wartości daty (month (), day (), itd.).
  • opcja yearcutoff może być użyta, jeśli musisz odczytać dwucyfrowe lata.

problemy, na które należy zwrócić uwagę

  • daty są mieszane w polu tak, że żaden pojedynczy format daty nie może ich odczytać. Rozwiązanie: odczytaj pole jako pole znakowe, przetestuj ciąg znaków i użyj funkcji wejściowej i odpowiedniego formatu, aby odczytać wartość do zmiennej daty.
  • nie ma formatu mogącego odczytać datę. Rozwiązanie: odczytaj datę jako składniki i użyj funkcji do wytworzenia wartości daty.
  • czasami domyślne dla yearcutoff nie jest domyślne dla wersji pakietu wspomnianej powyżej. Rozwiązanie: aby określić bieżące ustawienie dla yearcutoff wystarczy uruchomić program zawierający
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    spowoduje to wyjście zawierające bieżącą wartość yearcutoff.