Trabajo con fechas SAS. Formatos de fecha SAS más utilizados
Noviembre 10th, 2008 | por rvaquerizo |En esta nueva entrega del monografico de fechas SAS vamos a estudiar algunos formatos. Un formato es la forma en la que vemos una variable. 17327 es un valor sin significado, pero el 20 de junio de 2007 es una fecha. En la anterior entrega estudiamos como SAS guardaba las fechas como variables numéricas, como el número de días transcurridos desde el 1 de enero de 1960. Las fechas/horas se guardaban como el número de segundos transcurridos. Con los distintos formatos fecha/hora nosotros podremos visualizar estas variables numéricas de SAS. Por ejemplo:
data borrar;
x=1; y=1; z=1; m=1;
format x date9. y ddmmyy10. z datetime20. m time10.;proc print noobs; run;
x y z m
02JAN1960 02/01/1960 01JAN1960:00:00:01 0:00:01
Vemos como internamente el valor 1 toma por un lado el 02/01/1960 para fechas y 1 segundo del 01/01/1960 para fechas/hora y 1 segundo para variables numéricas tipo hora. Disponemos de la ayuda de SAS para conocer todos los formatos, en este capítulo del monográfico se trabajará con algunos ejemplos de los formatos fecha más habituales, los formatos fecha/hora se representan habitualmente como datetimeN. y timeN. y no es normal emplear otros; por ello nos centraremos en las fechas. Veamos algunos ejemplos que recogen los formatos de fecha más utilizados en SAS:
data borrar;
x="01JAN2008"d;
y=x+10;
z=y+100;
m=z-12;
format x ddmmyy8. y ddmmyy10. z yymmddn8. m date7.;proc print noobs; run;
x y z m
01/01/08 11/01/2008 20080420 08APR08
El formato ddmmyyN. es "la estrella", los formatos dateN. no son tan usados si trabajamos con el idioma español pero puede ser interesante trabajar con él si deseamos calcular fechas de referencia que puedan ser parámetros macro. En este ejemplo también vemos el YYMMDDN8 usado como numérico en muchas BBDD. En función de la longitud podemos modificar estos formatos, pero hay que tener cuidado con poner una longitud no valida como por ejemplo ddmmyy11. esto nos llevaría a tener un error. Como ya se ha comentado en la ayuda de SAS tenemos todos los formatos disponibles y debe ser nuestro material de consulta imprescindible. Otros ejemplos interesantes son:
data borrar;
x="01JAN2008"d;
y=x+10;
z=y+100;
m=z-12;
format x julian7. y EURDFDD10. z yymmn6. m worddate20.;proc print noobs; run;
x y z m
2008001 11.01.2008 200804 April 8, 2008
Los formatos julianos son habituales en máquinas antiguas. El formato DD.MM.YYYY también es habitual y, particularmente, yo lo empleo bastante. El YYYYMM puede sernos muy útil cuando queramos trabajar con meses y por último el WORDDATEN. que junto con el idioma español no queda muy "elegante".
A través de los formatos podremos "transformar" nuestras variables fecha en otras variables SAS, para ello podemos emplear la función PUT. PUT transforma una variable numérica a caracter, veamos un par de ejemplos de uso:
data _null_;
x="01JAN2008"d;
y=x-12;
referencia=quote(put(y,date7.))||"d";
put referencia;z=x+19;
mes=put(z,yymmn6.)*1;
put mes;
run;
La variable referencia de nuestro paso data será la cadena alfanumérica "20DEC07"d y mes será numérica de valor 200801, dos formas muy prácticas en SAS de representar fechas. Por otro lado hay ocasiones en las que valores numéricos o caracter han de pasar a ser valores fecha, por ejemplo:
data _null_;
y=20080501;
z=20070501;x=y-z; put x=;
run;
Es evidente que trabajamos con 2 fechas y el resultado de esa diferencia no puede ser 10000. Luego necesitamos transformar una variable numérica en una variable fecha:
data _null_;
y=20080501;
z=20070501;
y1=input(compress(put(mod(y,100),z2.)||put(mod(int(y/100),100),z2.)||int(y/10000)),ddmmyy8.);
z1=input(compress(put(mod(z,100),z2.)||put(mod(int(z/100),100),z2.)||int(z/10000)),ddmmyy8.);
x=y1-z1; put x=;
run;
¡Da miedo la transformación de variables! Se ha empleado la función INPUT que transforma variables alfanuméricas en variables numéricas. Pero no hay que asustarse (mucho) con la transformación de variables numéricas a fecha ya que en la siguiente entrega trabajaremos con funciones que nos facilitan mucho esta labor. Aun así es importante conocer la metodología para pasar de numéricas a fecha. Tanto la función PUT como INPUT tendrán un monográfico sobre su uso, sirvan estos casos a modo de introducción.
Como siempre para cualquier duda o sugerencia... rvaquerizo@analisisydecision.es
Etiquetas: fechas sas, formatos sas
13 Respuestas en “Trabajo con fechas SAS. Formatos de fecha SAS más utilizados”
Por Victor, Sep 2, 2009 | Responder
Hola, tengo un campo tipo alfanumerico con la fecha escrita de esta manera: yyyy-mm-dd, y me gustaria cambiar el formato de la variable a numerico con la fecha escrita igual sin guiones.
He probado a poner el codigo como el vuestro pero supongo que no funciona xq tengo la version 4.1 de sas que es un poco antigua.
Si me hecharan una mano se lo agradeceria.
Saludos
Por rvaquerizo, Sep 2, 2009 | Responder
Victor, emplea estas funciones:
data _null_;
y=”2009-02-11″;
fecha=mdy(substr(y,6,2)*1,substr(y,9,2)*1,substr(y,1,4)*1);
put borra fecha=yymmdd10.;
run;
El formato fecha aaaa-mm-dd es el yymmdd10. Me parece extraño que no te funcione:
data _null_;
y=”2009-02-11″;
fecha2=input(y,yymmdd10.);
put fecha2=yymmdd10.;
run;
Por ffernandez, Sep 2, 2009 | Responder
Yo lo que he entendido que quiere hacer es algo como esto:
data uno;
y=”2009-02-11″;
fecha=(substr(y,1,4)||substr(y,6,2)||substr(y,9,2))*1;
run;
Lo que no se muy bien es para qué. Salvo utilizarla como parte de una clave o algo así.
Por Victor, Sep 3, 2009 | Responder
Al final lo consegui de esta manera:
data creuar (drop=ID_FCH_MORA);
set creuar;
any=SUBSTR(ID_FCH_MORA,1,4); mes=SUBSTR(ID_FCH_MORA,6,2); dia=SUBSTR(ID_FCH_MORA,9,2);
ID_FCH_MORA_2=10000*any+100*mes+dia;
run;
data creuar (drop=ID_FCH_MORA_2);
set creuar;
ID_FCH_MORA=ID_FCH_MORA_2;
run;
Gracias chicos, no pensaba q contestasen tan rapido. Buena página por cierto.
Por ffernandez, Sep 3, 2009 | Responder
Es equivalente, aunque un poco más rebuscado. Pero me sigue provocando curiosidad para qué la quieres en ese formato…
Por rvaquerizo, Sep 3, 2009 | Responder
Por cierto para eliminar caracteres compress viene muy bien:
data uno;
y=”2009-02-11″;
fecha=compress(y,”-”)*1;
run;
Por ffernandez, Sep 3, 2009 | Responder
Pues sí… queda demostrado que en SAS hay como mínimo 10 formas distintas de hacer cada cosa. No se hasta que punto esto es algo bueno o malo…
Por Victor, Sep 14, 2009 | Responder
Me gusta tener las fechas en formato numerico ya que soy matematico, eso de los caracteres me pone un poco nervioso, jejejeje
Por ffernandez, Sep 14, 2009 | Responder
Si, si, si eso lo entendemos, yo soy estadístico y los que escribimos por aquí otro tanto. Pero para eso SAS tiene un formato de fecha numérico mucho más útil que el 20090101, sobre el que puedes utilizar diferentes funciones para obtener diferencias entre fechas, y muchas otras cosas, por eso me extraña que no quieras utilizar ese formato y sí el yyyymmdd numérico.
Por Victor, Sep 14, 2009 | Responder
Trabajo con este tipo de fecha porque ya la primera con la que trabaje ya me venia asi, soy nuevo en esto. Qual es el formato numérico para las fechas con el que se puede usar funciones?
Por Victor, Sep 14, 2009 | Responder
Ah, bien te refieres a los formatos 02JAN1960 02/01/1960 01JAN1960:00:00:01 0:00:01
que se suponen numéricos. Ya te digo, yo veo mas fácil hacer la parte entera de 20090101/1000 para sacar el año. Supongo que con el tiempo me habituare a ellos. Saludos
Por ffernandez, Sep 14, 2009 | Responder
SAS proporciona un formato de fechas que es muy útil para realizar ciertas operaciones. El formato es una representación que consiste en el número de días de diferencia respecto de una fecha base, que por defecto creo que es el 1 de enero de 1960 (se puede cambiar). Sobre este formato se pueden utilizar muchas funciones de SAS que permiten extraer la parte que nos interesa y realizar operaciones de diferencia de fechas, y bastantes cosas mas (month(), day(), year(),weekday(), intck()…). La lista de funciones y operaciones que puedes hacer es enorme. Creo que Raúl tiene más de un artículo en este mismo blog explicando el uso básico de las fechas SAS. Te recomiendo que hagas una búsqueda por el google al respecto, ya que una vez que te familiarizas con ellas son de muchísima utilidad.
Por Luis Diego, Mar 3, 2010 | Responder
Hola, mi caso es el siguiente:
Estoy haciendo un trabajo con visual basic 6.0, toma un archivo plano que viene con fechas y las mismas requiero convertirlas un valor numerico (serial date), para luego ingresarlo en un AS400, alguien me puede indicar como convertir de normal date to serial date.
Gracias.