Articles

Dates/SAS-Oppimiskokonaisuuksien käyttäminen

tietojen lukupäivämäärien lukeminen

Tämä moduuli näyttää, miten voidaan lukea PÄIVÄMÄÄRÄMUUTTUJIA, käyttää päivämääräfunktioita ja käyttää PÄIVÄYSNÄYTTÖFORMAATTEJA SAS-järjestelmässä. Sinun oletetaan tuntevan datavaiheet tietojen lukemiseen SAS: iin ja tehtävälausunnot uusien muuttujien laskemiseen. Jos jokin konsepteista on täysin Uusi, kannattaa katsoa alta lisää ohjeita muihin oppimiskokonaisuuksiin. Ensimmäisessä esimerkissä käytetty tiedosto esitetään seuraavaksi.

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

alla oleva ohjelma lukee tiedot ja luo tilapäisen datatiedoston nimeltä dates. Huomaa, että päivämäärät luetaan data vaiheessa, ja muoto date11. käytetään päivämäärän lukemiseen.

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; 

proc-tulosteen tuotos on esitetty alla. Vertaa tietojen päivämääriä bdayn arvoihin. Huomaa, että John päivämäärä on 1 tammikuu 1960 ja arvo bday on 0. Tämä johtuu siitä, että päivämäärät tallennetaan SAS: n sisällä päivien lukumääränä 1.1.1960 alkaen. Koska Mary syntyi ennen vuotta 1960, bdayn arvo hänelle on negatiivinen (-1635).

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

jotta näkisit päivämäärät siten, että ymmärrämme sinun olisi muotoiltava tuloste. Käytämme date9: ää. muoto nähdä päivämäärät muodossa ddmmyyyy. Tämä on määritelty muoto lauseke.

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

tässä on yllä olevan proc print-lausunnon tuottama tuotos.

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

tarkastellaan seuraavia tietoja Ensisilmäyksellä näyttää siltä, että päivämäärät ovat niin erilaisia, ettei niitä voinut lukea. Niillä on kaksi yhteistä asiaa:

1) niillä kaikilla on numeeriset kuukaudet,
2) ne kaikki ovat järjestyksessä kuukausi, päivä ja sitten vuosi.

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

nämä päivämäärät voidaan lukea samassa muodossa, mmddyy11. Seuraavassa on esimerkki kyseisen muodon käytöstä datavaiheessa.

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;

yllä olevan proc-tulosteen tulokset osoittavat, että kaikki päivämäärät luetaan oikein.

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

on olemassa monenlaisia formaatteja, joita voidaan käyttää päiväysten lukemiseen SAS: iin. Seuraavassa on näyte joitakin näistä formaatteja.

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

tarkastellaan seuraavia tietoja, joissa järjestys on kuukausi, vuosi ja päivä.

 7 1948 11 1 1960 110 1970 1512 1971 10 

voit lukea nämä tiedot kunkin osan ajankohdasta erillisenä muuttujana kuten seuraavassa tietovaiheessa.

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;

huomaa funktio MDY(Kuukausi,Päivä,Vuosi) tietovaiheessa. Tätä funktiota käytetään luomaan päivämääräarvo yksittäisistä komponenteista. Tulos proc print seuraa.

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

kaksinumeroiset päivämäärät

pitävät seuraavia tietoja, jotka ovat samat kuin edellä, paitsi että vuotta merkitään vain kahdella numerolla ja vuosi näkyy viimeisenä.

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

tietojen lukeminen on samaa kuin äsken.

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;

proc-tulostuksen tulokset on esitetty alla.

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

kaksinumeroinen vuosi toimii tässä, koska SAS: n lähtökohtana on raja (yearcutoff), jota ennen arvo kaksinumeroinen vuosi tulkitaan vuodeksi 2000 ja sitä ylemmäksi ja sen jälkeen 1999 ja sitä alemmaksi. Yearcutoffin oletus eroaa SAS: n eri versioissa:

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

seuraavan ohjelman optiolauseke muuttaa yearcutoffin arvon 1920: ksi. Tämä aiheuttaa sen, että kaksinumeroisina vuosina alle 20 luetaan vuoden 2000 jälkeen. Suorita sama ohjelma sitten tuottaa erilaisia tuloksia, kun tämä asetus on asetettu.

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;

proc-tulostuksen tulokset on esitetty alla. Ensimmäisen havainnon luetaan nyt tapahtuneen vuonna 2018 vuoden 1918 sijaan.

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

laskelmat, joissa on kulunut päivämäärä

SAS-päivämäärämuuttujat tekevät laskutoimituksista, joissa päivämäärät ovat erittäin käteviä. Esimerkiksi laskea kaikkien ikä 1. tammikuuta 2000 käyttää seuraavia muuntaminen data vaiheessa.

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

ohjelma tämän laskennan yhteydessä seuraa.

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;

proc-tulostuksen tulokset on esitetty alla. Muuttuja AGE2000 sisältää nyt iän vuosina 1.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

muita hyödyllisiä päivämääräfunktioita

on olemassa joukko hyödyllisiä funktioita käytettäväksi päivämäärämuuttujien kanssa. Seuraavassa on luettelo joistakin näistä toiminnoista.

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

seuraava ohjelma osoittaa näiden funktioiden käytön.

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;

proc-tulostuksen tulokset on esitetty alla. Uudet muuttujat sisältävät kuukauden, päivän, vuoden, viikonpäivän ja vuosineljänneksen.

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

Yhteenveto

  • päivämäärät luetaan päivämäärämuodoilla, tavallisimmin päivämäärä9. ja kkdvvv11.
  • Date-funktioilla voidaan luoda date-arvoja niiden komponenteista (mdy(m,d,y)) ja poimia komponentit päivämääräarvosta (kuukausi (), päivä () jne.).
  • yearcutoff-optiota voi käyttää, jos joutuu lukemaan kaksinumeroisen vuoden.

  • päivämäärät sekoitetaan kentän sisällä siten, että mikään yksittäinen päivämäärämuoto ei pysty lukemaan niitä. Ratkaisu: Lue kenttä merkkikenttänä, testaa merkkijono ja käytä tulofunktiota ja sopivaa muotoa arvon lukemiseen päivämäärämuuttujaan.
  • ei ole muotoa, joka pystyisi lukemaan päivämäärän. Ratkaisu: Lue päivämäärä komponentteina ja käytä toimintoa päivämäärän arvon tuottamiseksi.
  • joskus yearcutoffin oletusarvo ei ole edellä mainitun paketin version oletusarvo. Ratkaisu: yearcutoffin nykyisen asetuksen määrittämiseksi suorita ohjelma, joka sisältää
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    Tämä johtaa tulosteeseen, joka sisältää yearcutoffin nykyisen arvon.