Data lezen in data

In deze module leert u hoe u datumvariabelen kunt lezen, datumfuncties kunt gebruiken en datumweergaveformaten in SAS kunt gebruiken. U wordt verondersteld bekend te zijn met data steps voor het inlezen van gegevens in SAS, en assignment statements voor het berekenen van nieuwe variabelen. Als een van de concepten volledig nieuw is, kunt u kijken op Voor meer informatie hieronder voor aanwijzingen naar andere leermodules. Het gegevensbestand dat in het eerste voorbeeld wordt gebruikt, wordt hierna weergegeven.

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

Het onderstaande programma leest de gegevens en maakt een tijdelijk gegevensbestand aan met de naam data. Merk op dat de data worden gelezen in de data stap, en het formaat date11. wordt gebruikt om de datum te lezen.

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; 

De uitvoer van het proc print is hieronder weergegeven. Vergelijk de datums in de gegevens met de waarden van bday. Merk op dat voor John de datum 1 jan 1960 is en de waarde voor bday 0. Dit komt omdat datums intern in SAS worden opgeslagen als het aantal dagen vanaf 1 jan 1960. Aangezien Mary geboren is voor 1960 is de waarde van bday voor haar negatief (-1635).

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

Om de datums te kunnen zien op een manier die wij begrijpen, moet u de uitvoer formatteren. We gebruiken het date9. formaat om datums te zien in de vorm ddmmmyyyy. Dit wordt gespecificeerd in een format statement.

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

Hier is de uitvoer die wordt geproduceerd door het proc print statement hierboven.

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

Laten we eens kijken naar de volgende gegevens. Op het eerste gezicht lijkt het alsof de data zo verschillend zijn dat ze niet gelezen kunnen worden. Ze hebben echter twee dingen gemeen:

1) ze hebben allemaal numerieke maanden,
2) ze zijn allemaal geordend maand, dag, en dan jaar.

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

Deze data kunnen worden gelezen met hetzelfde formaat, mmddyy11. Een voorbeeld van het gebruik van dat formaat in een gegevensstap volgt hierna.

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;

De resultaten van de bovenstaande proc-print tonen aan dat alle datums correct worden gelezen.

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

Er is een grote verscheidenheid aan indelingen beschikbaar voor gebruik bij het inlezen van datums in SAS. Hieronder volgt een voorbeeld van enkele van die indelingen.

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

Bekijk de volgende gegevens eens in de volgorde maand, jaar en dag.

 7 1948 11 1 1960 110 1970 1512 1971 10 

U kunt deze gegevens lezen met elk deel van de datum in een afzonderlijke variabele zoals in de gegevensstap die volgt.

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;

Let op de functie mdy(maand,dag,jaar) in de gegevensstap. Deze functie wordt gebruikt om een datumwaarde te creëren uit de afzonderlijke componenten. Het resultaat van de proc print volgt.

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

Tweecijferige data

Bekijk de volgende gegevens, die hetzelfde zijn als hierboven, behalve dat slechts twee cijfers worden gebruikt om het jaar aan te geven, en dat het jaar als laatste verschijnt.

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

Het lezen van de data gaat op dezelfde manier als we zojuist deden.

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;

De resultaten van de proc-print staan hieronder.

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

Tweecijferige jaren werken hier omdat SAS uitgaat van een cutoff (yearcutoff) vóór welke waarde tweecijferige jaren worden geïnterpreteerd als het jaar 2000 en hoger en na welke waarde ze worden geïnterpreteerd als 1999 en lager. De standaardjaarafsnijding verschilt voor verschillende versies van SAS:

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

De optie-instructie in het programma dat volgt, verandert de jaarafsnijdingswaarde in 1920. Hierdoor worden in tweecijferige jaren lager dan 20 gelezen als na het jaar 2000. Het uitvoeren van hetzelfde programma zal dan andere resultaten geven wanneer deze optie is ingesteld.

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;

De resultaten van de proc print zijn hieronder te zien. De eerste waarneming wordt nu gelezen als voorkomend in 2018 in plaats van 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

Berekeningen met verstreken datums

SAS datumvariabelen maken berekeningen met datums erg handig. Om bijvoorbeeld de leeftijd van iedereen op 1 januari 2000 te berekenen, gebruikt u de volgende conversie in de gegevensstap.

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

Het programma met deze berekening in de context volgt hierna.

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;

Het resultaat van de proc-print ziet er als volgt uit. De variabele AGE2000 bevat nu de leeftijd in jaren per 1 januari 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

Andere nuttige datumfuncties

Er zijn een aantal nuttige functies voor gebruik met datumvariabelen. Hieronder volgt een lijst met enkele van die functies.

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

Het volgende programma demonstreert het gebruik van deze functies.

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;

De proc printresultaten staan hieronder. De nieuwe variabelen bevatten de maand, de dag, het jaar, de dag van de week en het kwartaal.

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

Samenvatting

  • Datums worden gelezen met datumnotaties, meestal date9. en mmddyy11.
  • Datumfuncties kunnen worden gebruikt om datumwaarden te creëren uit hun componenten (mdy(m,d,y)), en om de componenten uit een datumwaarde te extraheren (month(),day(), enz.).
  • De optie yearcutoff kan worden gebruikt als u tweecijferige jaren moet lezen.

Problemen om voor uit te kijken

  • Data worden gemengd binnen een veld zodanig dat geen enkele datumnotatie ze kan lezen. Oplossing: Lees het veld als een tekenveld, test de tekenreeks, en gebruik de invoerfunctie en het juiste formaat om de waarde in de datumvariabele in te lezen.
  • Er is geen enkele opmaak die de datum kan lezen. Oplossing: lees de datum in als componenten en gebruik een functie om een datumwaarde te produceren.
  • Soms is de standaard voor yearcutoff niet de standaard voor de hierboven genoemde versie van het pakket. Oplossing: om de huidige instelling voor yearcutoff te bepalen, voert u eenvoudig een programma uit met
    PROC OPTIONS OPTION=YEARCUTOFF; RUN;
    Dit zal resulteren in uitvoer met de huidige waarde van yearcutoff.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.