Päivämäärien lukeminen tiedoista

Tässä moduulissa näytetään, miten päivämäärämuuttujia luetaan, miten päivämäärätoimintoja käytetään ja miten päivämäärän näyttömuotoja käytetään SAS:ssa. Oletetaan, että tunnet data-askeleet tietojen lukemiseksi SAS:iin ja osoituslausekkeet uusien muuttujien laskemiseksi. Jos jokin käsitteistä on sinulle täysin uusi, voit tutustua alla olevaan kohtaan Lisätietoja, josta löydät ohjeet muihin oppimismoduuleihin. Seuraavaksi esitetään ensimmäisessä esimerkissä käytetty datatiedosto.

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

Alla oleva ohjelma lukee tiedot ja luo väliaikaisen datatiedoston nimeltä dates. Huomaa, että päivämäärät luetaan data-askeleessa, ja päivämäärän lukemiseen käytetään muotoa 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; 

Alla on esitetty proc printin tuloste. Vertaa datassa olevia päivämääriä bday:n arvoihin. Huomaa, että Johnin kohdalla päivämäärä on 1.1.1960 ja bday:n arvo on 0. Tämä johtuu siitä, että päivämäärät tallennetaan SAS:ssa sisäisesti päivien lukumääränä 1.1.1960 alkaen. Koska Mary on syntynyt ennen vuotta 1960, hänen bday-arvonsa on negatiivinen (-1635).

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

Jotta päivämäärät näkyisivät meille ymmärrettävällä tavalla, tuloste pitäisi muotoilla. Käytämme date9. -muotoa nähdäksemme päivämäärät muodossa ddmmmyyyy. Tämä määritetään format-lauseella.

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

Tässä on yllä olevan proc print -lauseen tuottama tuloste.

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

Katsotaanpa seuraavia tietoja. Ensi silmäyksellä näyttää siltä, että päivämäärät ovat niin erilaisia, ettei niitä voisi lukea. Niillä on kuitenkin kaksi yhteistä asiaa:

1) niissä kaikissa 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 tämän muodon käytöstä tietovaiheessa.

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-tulostuksen 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

Datumien lukemiseen SAS:iin on käytettävissä monenlaisia formaatteja. Seuraavassa on esimerkki joistakin näistä muodoista.

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 siten, että jokainen päivämäärän osa on erillisessä muuttujassa, kuten seuraavassa data-askeleessa.

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 data-askeleessa oleva funktio mdy(month,day,year). Tätä funktiota käytetään päivämäärän arvon luomiseen yksittäisistä komponenteista. Proc-tulostuksen tulos 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

Harkitse seuraavia tietoja, jotka ovat samat kuin edellä, paitsi että vuoden merkitsemiseen käytetään vain kahta numeroa ja vuosi esiintyy viimeisenä.

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

Tietojen lukeminen tapahtuu samalla tavalla 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 näkyvät 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

Kaksinumeroiset vuosiluvut toimivat tässä, koska SAS olettaa cutoffin (yearcutoff), jota ennen arvoa kaksinumeroiset vuosiluvut tulkitaan vuosiluvuiksi 2000 ja sitä suuremmiksi ja sen jälkeen ne tulkitaan vuosiluvuiksi 1999 ja sitä pienemmiksi. Oletusarvoinen yearcutoff vaihtelee SAS:n eri versioissa:

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

Seuraavassa ohjelmassa oleva options-lause muuttaa yearcutoff-arvon arvoksi 1920. Tämä aiheuttaa sen, että kaksinumeroiset vuodet, jotka ovat pienempiä kuin 20, luetaan vuoden 2000 jälkeisiksi. Saman ohjelman suorittaminen antaa tämän jälkeen erilaisia tuloksia, kun tämä vaihtoehto 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 näkyvät alla. Ensimmäinen havainto luetaan nyt tapahtuneeksi vuonna 2018 eikä vuonna 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

Laskennat kuluneilla päivämäärillä

SAS:n päivämäärämuuttujat tekevät päivämääriä sisältävistä laskennoista erittäin käteviä. Jos haluat esimerkiksi laskea kaikkien iän 1. tammikuuta 2000, käytä data-askeleessa seuraavaa muunnosta.

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

Tämän laskutoimituksen sisältävä ohjelma 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 näkyvät alla. Muuttuja AGE2000 sisältää nyt iän vuosina 1. tammikuuta 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

Muut hyödyllisiä päivämäärämuuttujia käyttäviä funktioita

Päivämuuttujien kanssa käytettäviä hyödyllisiä funktioita on useita. Seuraavassa on luettelo joistakin näistä funktioista.

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

Oheinen ohjelma demonstroi näiden funktioiden käyttöä.

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;

Procin tulostustulokset näkyvät 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, yleisimmin date9. ja mmddyy11.
  • Päiväysfunktioita voidaan käyttää päiväysarvojen luomiseen niiden komponenteista (mdy(m,d,y)) ja komponenttien poimimiseen päiväysarvosta (month(),day() jne.).
  • Yearcutoff-vaihtoehtoa voidaan käyttää, jos on luettava kaksinumeroisia vuosia.

Problems to look out for

  • Päivämäärät sekoittuvat kentän sisällä siten, että mikään yksittäinen päivämäärämuoto ei voi lukea niitä. Ratkaisu: Lue kenttä merkkikenttänä, testaa merkkijono ja käytä syöttöfunktiota ja sopivaa formaattia arvon lukemiseen päivämäärämuuttujaan.
  • Mikään formaatti ei pysty lukemaan päivämäärää. Ratkaisu: Lue päivämäärä komponentteina ja käytä funktiota päivämäärän arvon tuottamiseen.
  • Joskus yearcutoff-arvon oletusarvo ei ole edellä mainitun paketin version oletusarvo. Ratkaisu: yearcutoffin nykyisen asetuksen määrittämiseksi yksinkertaisesti ajetaan ohjelma, joka sisältää
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    Tuloksena on tuloste, joka sisältää yearcutoffin nykyisen arvon.

Vastaa

Sähköpostiosoitettasi ei julkaista.