Gebruik van datums / SAS leermodules
lezen van datums in data
Deze module laat zien hoe u datumvariabelen leest, datumfuncties gebruikt en datumweergave-indelingen gebruikt in SAS. U wordt verondersteld vertrouwd te zijn met data stappen voor het lezen van gegevens in SAS, en toewijzing verklaringen voor het berekenen van nieuwe variabelen. Als een van de concepten zijn volledig nieuw, kunt u kijken naar voor meer informatie hieronder voor aanwijzingen naar andere leermodules. Het gegevensbestand dat in het eerste voorbeeld wordt gebruikt, wordt hierna gepresenteerd.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
het programma hieronder leest de gegevens en maakt een tijdelijk gegevensbestand aan met de naam dates. Merk op dat de datums worden gelezen in de gegevensstap en de format 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 de proc-afdruk wordt 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 is 0. Dit komt omdat data intern worden opgeslagen in SAS als het aantal dagen vanaf Jan 1.1960. Omdat Maria voor 1960 werd geboren 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 zien op een manier die we begrijpen, moet u de uitvoer formatteren. We gebruiken de datum9. formaat om datums te zien in de vorm ddmmmyyyy. Dit wordt gespecificeerd op een format statement.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Hier is de uitvoer van het bovenstaande proc print statement.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
laten we de volgende gegevens bekijken. Op het eerste gezicht lijkt het alsof de data zo verschillend zijn dat ze niet gelezen konden worden. Ze hebben twee dingen gemeen:
1) Ze hebben allemaal numerieke maanden,
2) Ze zijn allemaal geordend Maand, Dag en vervolgens jaar.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
deze datums kunnen met hetzelfde formaat worden gelezen, mmddy11. Een voorbeeld van het gebruik van dat formaat in een gegevensstap volgt.
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 laten zien dat alle data 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 formaten beschikbaar voor het lezen van data in SAS. Het volgende is een voorbeeld van een aantal van deze formaten.
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
beschouw de volgende gegevens waarin de volgorde maand, jaar en dag is.
7 1948 11 1 1960 110 1970 1512 1971 10
u kunt deze gegevens lezen met elk deel van de datum in een aparte variabele zoals in de volgende gegevensstap.
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 maken van 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 datums
Houd rekening met de volgende gegevens, die hetzelfde zijn als hierboven, behalve dat slechts twee cijfers worden gebruikt om het jaar aan te geven, en het jaar als laatste verschijnt.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
Het lezen van de gegevens is hetzelfde als we net 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-afdruk worden hieronder getoond.
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 (jaarcutoff) waarvoor waarde tweecijferige jaren worden geïnterpreteerd als het jaar 2000 en hoger en waarna ze worden geïnterpreteerd als 1999 en lager. De standaard yearcutoff verschilt voor verschillende versies van SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
Het options statement in het volgende programma verandert de yearcutoff-waarde in 1920. Dit zorgt ervoor dat in twee cijferjaren lager dan 20 wordt gelezen als na het jaar 2000. Het uitvoeren van hetzelfde programma zal dan verschillende resultaten opleveren 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-afdruk worden hieronder getoond. De eerste waarneming wordt nu gelezen als 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.
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;
de resultaten van de proc print worden hieronder getoond. De variabele LEEFTIJD2000 bevat nu de leeftijd in jaren vanaf 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. Het volgende is een lijst van enkele van deze 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-afdrukresultaten worden hieronder getoond. De nieuwe variabelen bevatten de maand, dag, Jaar, Dag van de week en 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 datumformaten, meestal date9. en mmddy11.
- datumfuncties kunnen worden gebruikt om datumwaarden te maken uit hun componenten (mdy (m, d, y)), en om de componenten uit een datumwaarde (month (), day (), enz.).
- de optie yearcutoff kan worden gebruikt als u twee cijferjaren moet lezen.
problemen bij het zoeken naar
- datums worden binnen een veld zodanig gemengd dat geen enkele datumnotatie ze kan lezen. Oplossing: lees het veld als een tekenveld, test de string en gebruik de invoerfunctie en het juiste formaat om de waarde in de datumvariabele te lezen.
- Er is geen formaat dat de datum kan lezen. Oplossing: lees de datum als componenten en gebruik een functie om een datumwaarde te produceren.
- soms is de standaard voor yearcutoff niet de standaard voor de versie van het hierboven genoemde pakket. Oplossing: om de huidige instelling voor yearcutoff te bepalen, voert u een programma uit dat
PROC opties bevat OPTION = YEARCUTOFF; RUN;
Dit zal resulteren in uitvoer die de huidige waarde van yearcutoff bevat.