Odczytywanie dat w danych

W tym module pokażemy, jak odczytywać zmienne daty, używać funkcji daty i używać formatów wyświetlania daty w SAS. Zakłada się, że użytkownik zna kroki danych służące do wczytywania danych do SAS oraz instrukcje przypisania służące do obliczania nowych zmiennych. Jeśli któreś z pojęć jest zupełnie nowe, warto zajrzeć do sekcji Więcej informacji poniżej, gdzie znajdują się wskazówki do innych modułów szkoleniowych. Plik danych użyty w pierwszym przykładzie jest przedstawiony poniżej.

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

Poniższy program wczytuje dane i tworzy tymczasowy plik danych o nazwie daty. Zwróć uwagę, że daty są odczytywane w kroku data, a do odczytu daty jest używany format 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; 

Wyniki działania proc print są przedstawione poniżej. Porównaj daty w danych z wartościami bday. Zauważ, że dla Jana datą jest 1 stycznia 1960 r., a wartością bday jest 0. Dzieje się tak dlatego, że daty są przechowywane w SAS jako liczba dni od 1 stycznia 1960 r. 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 zrozumiały dla nas, trzeba by sformatować dane wyjściowe. Używamy formatu date9. aby zobaczyć daty w postaci ddmmmyyyy. Jest to określone w instrukcji formatu.

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

Tutaj znajduje się wyjście wyprodukowane przez powyższą instrukcję proc print.

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

Przyjrzyjrzyjmy się następującym danym. Na pierwszy rzut oka wygląda na to, że daty są tak różne, że nie da się ich odczytać. Mają jednak dwie wspólne cechy:

1) wszystkie mają miesiące numeryczne,
2) wszystkie są uporządkowane jako miesiąc, dzień, a następnie rok.

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

Daty te można odczytać w tym samym formacie, mmddyy11. Przykład użycia tego formatu w kroku danych jest następujący.

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 proc print pokazują, że wszystkie daty zostały poprawnie odczytane.

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

Do odczytu dat w SAS można wykorzystać wiele różnych formatów. Poniżej przedstawiono przykład 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

Rozważmy 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 poniższym 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;

Zauważ funkcję mdy(miesiąc,dzień,rok) w kroku danych. Funkcja ta służy do wytworzenia wartości daty z poszczególnych składników. Wynik działania proc print 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

Daty dwucyfrowe

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

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

Odczytanie tych danych jest takie samo, 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;

Wyniki działania proc print są pokazane poniżej.

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

Dwucyfrowe lata działają tutaj, ponieważ SAS zakłada odcięcie (yearcutoff), przed którym wartość dwucyfrowa jest interpretowana jako rok 2000 i wyższy, a po którym jest interpretowana jako 1999 i niższy. Domyślna wartość odcięcia roku jest różna dla różnych wersji SAS:

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

Konstrukcja opcji w poniższym programie zmienia wartość odcięcia roku na 1920. Powoduje to, że lata dwucyfrowe mniejsze od 20 są odczytywane jako następujące po roku 2000. Uruchomienie tego samego programu da inne 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;

Wyniki działania proc print są pokazane poniżej. Pierwsza obserwacja jest teraz odczytana jako występująca w roku 2018, a nie 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

Obliczenia z datami upływającymi

Zmienne daty SAS sprawiają, że obliczenia z użyciem dat są bardzo wygodne. Na przykład, aby obliczyć wiek każdej osoby w dniu 1 stycznia 2000 r., należy użyć następującej konwersji w kroku danych.

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

Program z tymi obliczeniami w kontekście jest następujący.

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;

Wyniki proc print są pokazane poniżej. Zmienna AGE2000 zawiera teraz wiek w latach na dzień 1 stycznia 2000 roku.

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 użyteczne funkcje daty

Istnieje wiele użytecznych 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);

Następujący 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;

Wyniki drukowania proc są pokazane poniżej. 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 za pomocą formatów daty, najczęściej date9. i mmddyy11.
  • Funkcje daty mogą być używane do tworzenia wartości daty z ich składników (mdy(m,d,y)) oraz do wyodrębniania składników z wartości daty (month(),day(), itd.).
  • Opcja odcięcia roku może być użyta, jeśli musisz czytać dwucyfrowe lata.

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

  • Daty są mieszane w obrębie pola, tak że żaden pojedynczy format daty nie może ich odczytać. Rozwiązanie: Odczytaj pole jako pole znakowe, przetestuj ciąg znaków, a następnie użyj funkcji input i odpowiedniego formatu, aby odczytać wartość do zmiennej date.
  • Nie ma formatu zdolnego do odczytania daty. Rozwiązanie: odczytaj datę jako składowe i użyj funkcji do wytworzenia wartości daty.
  • Czasami domyślne ustawienie dla yearcutoff nie jest domyślne dla wspomnianej wersji pakietu. Rozwiązanie: aby określić bieżące ustawienie dla yearcutoff, wystarczy uruchomić program zawierający
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    W wyniku tego otrzymamy wyjście zawierające bieżącą wartość yearcutoff.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.