Uso de módulos de aprendizaje de fechas | SAS
Leer fechas en datos
Este módulo mostrará cómo leer variables de fecha, usar funciones de fecha y usar formatos de visualización de fecha en SAS. Se supone que está familiarizado con los pasos de datos para leer datos en SAS y con las instrucciones de asignación para calcular nuevas variables. Si alguno de los conceptos es completamente nuevo, es posible que desee ver más información a continuación para obtener instrucciones para otros módulos de aprendizaje. A continuación se presenta el archivo de datos utilizado en el primer ejemplo.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
El siguiente programa lee los datos y crea un archivo de datos temporal llamado fechas. Tenga en cuenta que las fechas se leen en el paso datos y el formato date11. se usa para leer la fecha.
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;
El resultado de el proceso de impresión se presentan a continuación. Compare las fechas de los datos con los valores de bday. Tenga en cuenta que para John la fecha es el 1 de enero de 1960 y el valor para bday es 0. Esto se debe a que las fechas se almacenan internamente en SAS como el número de días a partir del 1 de enero de 1960. Dado que María nació antes de 1960, el valor de bday para ella es negativo (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
para ver las fechas de una manera que nosotros entendemos que tendría que dar formato a la salida. Usamos la data9. formato para ver las fechas en el formulario ddmmmyyy. Esto se especifica en una declaración de formato.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Aquí está la salida producida por el proceso de impresión de la declaración anterior.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
echemos un vistazo a los siguientes datos. A primera vista, parece que las fechas son tan diferentes que no se podían leer. Tienen dos cosas en común:
1) todos tienen meses numéricos,
2) todos están ordenados mes, día y año.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
Estas fechas, se puede leer con el mismo formato, mmddyy11. A continuación se muestra un ejemplo del uso de ese formato en un paso de datos.
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;
Los resultados de la anterior proc print muestran que todas las fechas se lea correctamente.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
Hay una gran variedad de formatos disponibles para su uso en la lectura de las fechas en SAS. La siguiente es una muestra de algunos de esos formatos.
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
Considere los siguientes datos en la que el orden es el mes, el año y el día.
7 1948 11 1 1960 110 1970 1512 1971 10
Usted puede leer estos datos con cada porción de la fecha en una variable independiente como en los datos de paso que sigue.
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;
Aviso de la función mdy(mes,día,año) en los datos de paso. Esta función se utiliza para crear un valor de fecha a partir de los componentes individuales. A continuación se muestra el resultado de la impresión proc.
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
las fechas de Dos dígitos
Considere los siguientes datos, que son los mismos que el anterior, excepto que sólo dos dígitos se utiliza para indicar el año y el año en que aparece el último.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
la Lectura de los datos es el mismo que acabamos de hacer.
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;
los resultados de Los proc de impresión se muestra a continuación.
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
Los años de dos dígitos funcionan aquí porque SAS asume un valor de corte (yearcutoff) antes del cual los años de dos dígitos se interpretan como el año 2000 y superior y después se interpretan como 1999 y inferior. El yearcutoff predeterminado difiere para diferentes versiones de SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
La instrucción options del programa que sigue cambia el valor yearcutoff a 1920. Esto hace que en dos dígitos los años inferiores a 20 se lean como después del año 2000. Al ejecutar el mismo programa, se obtendrán resultados diferentes cuando se establezca esta opción.
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;
los resultados de Los proc de impresión se muestra a continuación. La primera observación se lee ahora como ocurrida en 2018 en lugar de 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
los Cálculos con transcurrido fechas
SAS fecha de variables de hacer los cálculos de fechas muy conveniente. Por ejemplo, para calcular la edad de todos el 1 de enero de 2000, use la siguiente conversión en el paso datos.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
El programa con este cálculo en el contexto de la siguiente manera.
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;
los resultados de Los proc de impresión se muestra a continuación. La variable AGE2000 ahora contiene la edad en años a partir del 1 de enero de 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
Otras útiles funciones de fecha
Hay una serie de funciones útiles para el uso con las variables de fecha. La siguiente es una lista de algunas de esas funciones.
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);
El siguiente programa muestra el uso de estas funciones.
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;
El proceso de impresión de resultados se muestra a continuación. Las nuevas variables contienen el mes, el día, el año, el día de la semana y el trimestre.
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
Resumen
- Fechas se leen con los formatos de fecha, más comúnmente date9. y mmddyy11.
- Las funciones de fecha se pueden usar para crear valores de fecha a partir de sus componentes (mdy(m,d,y)) y para extraer los componentes de un valor de fecha (month (), day (), etc.).
- La opción yearcutoff se puede usar si tiene que leer dos dígitos de años.
Los problemas para buscar fechas
- se mezclan dentro de un campo de modo que ningún formato de fecha puede leerlas. Solución: Lea el campo como un campo de caracteres, pruebe la cadena y utilice la función de entrada y el formato adecuado para leer el valor en la variable de fecha.
- no Hay ningún formato capaz de leer la fecha. Solución: lea la fecha como componentes y use una función para producir un valor de fecha.
- A veces, el valor predeterminado para yearcutoff no es el predeterminado para la versión del paquete mencionado anteriormente. Solución: para determinar la configuración actual de yearcutoff, simplemente ejecute un programa que contenga
PROC OPTIONS OPTION = YEARCUTOFF; RUN;
Esto dará como resultado una salida que contenga el valor actual de yearcutoff.