Lectura de fechas en datos

Este módulo mostrará cómo leer variables de fecha, utilizar funciones de fecha y usar formatos de visualización de fechas en SAS. Se supone que está familiarizado con los pasos de datos para leer datos en SAS, y las sentencias de asignación para calcular nuevas variables. Si alguno de los conceptos es completamente nuevo, es posible que quiera ver en Para más información más abajo las direcciones de 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 programa siguiente lee los datos y crea un archivo de datos temporal llamado fechas. Nótese que las fechas se leen en el paso de datos, y se utiliza el formato date11. 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; 

La salida del proc print se presenta a continuación. Compare las fechas en los datos con los valores de bday. Observe que para Juan la fecha es el 1 de enero de 1960 y el valor de bday es 0. Esto se debe a que las fechas se almacenan internamente en SAS como el número de días desde el 1 de enero de 1960. Como 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 entendamos habría que formatear la salida. Usamos el formato date9. para ver las fechas en la forma ddmmmyyy. Esto se especifica en una declaración de formato.

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

Aquí está la salida producida por la sentencia proc print anterior.

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

Miremos los siguientes datos. A primera vista parece que las fechas son tan diferentes que no se pueden leer. Tienen dos cosas en común:

1) todas tienen meses numéricos,
2) todas están ordenadas mes, día y luego año.

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

Estas fechas pueden leerse con el mismo formato, mmddyy11. A continuación, 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 impresión del proc anterior muestran que todas las fechas se leen 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 usar en la lectura de 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 los que el orden es mes, año y día.

 7 1948 11 1 1960 110 1970 1512 1971 10 

Puede leer estos datos con cada porción de la fecha en una variable separada como en el paso de datos 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;

Nota la función mdy(mes,día,año) en el paso de datos. Esta función se utiliza para crear un valor de fecha a partir de los componentes individuales. El resultado del proc print es el siguiente.

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

Fechas de dos dígitos

Considere los siguientes datos, que son los mismos que los anteriores excepto que sólo se utilizan dos dígitos para significar el año, y el año aparece en último lugar.

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

La lectura de los datos es la misma 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 del proc print se muestran 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 corte (yearcutoff) antes del cual el valor de los años de dos dígitos se interpreta como el año 2000 y superior y después del cual se interpreta como 1999 e inferior. El yearcutoff por defecto difiere para diferentes versiones de SAS:

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

La declaración de opciones en el programa que sigue cambia el valor del yearcutoff a 1920. Esto hace que los años de dos dígitos inferiores a 20 se lean como posteriores al año 2000. Si se ejecuta 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 del proc print se muestran 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

Cálculos con fechas transcurridas

Las variables de fecha del SAS hacen muy convenientes los cálculos que involucran fechas. Por ejemplo, para calcular la edad de todo el mundo el 1 de enero de 2000 utilice la siguiente conversión en el paso de datos.

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

El programa con este cálculo en contexto es el siguiente.

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;

A continuación se muestran los resultados del proc print. La variable AGE2000 contiene ahora 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 funciones de fecha útiles

Hay un número de funciones útiles para usar con 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 demuestra 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;

Los resultados de la impresión del proc se muestran 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

  • Las fechas se leen con formatos de fecha, más comúnmente date9. y mmddyy11.
  • Las funciones de fecha se pueden utilizar 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 utilizar si tiene que leer años de dos dígitos.

Problemas a tener en cuenta

  • Las fechas se mezclan dentro de un campo de tal manera 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 utilice una función para producir un valor de fecha.
  • A veces el valor por defecto para yearcutoff no es el valor por defecto 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 contiene el valor actual de yearcutoff.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.