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: ,

  1. 41 Respuestas en “Trabajo con fechas SAS. Formatos de fecha SAS más utilizados”

  2. 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

  3. 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;

  4. 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í.

  5. 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.

  6. 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…

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

  8. 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…

  9. 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

  10. 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.

  11. 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?

  12. 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

  13. 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.

  14. 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.

  15. Por jmls, Jul 18, 2011 | Responder

    Hola,

    necesitaría crear una macrovariable fecha con formato 20110720 a partir de otra con formato ’20jul2011′d, o a la inversa.

    Estoy atascado, ¿podéis echarme un cable?

  16. Por ffernandez, Jul 18, 2011 | Responder

    siendo vieja=”20jul2011″d y nueva la que queremos, algo asi como:
    nueva=year(vieja)||put(month(vieja,z2.)||put(day(vieja,z2.); Debería darte la primera, al revés seria algo así como:
    vieja=put(mdy(substr(nueva,5,2),substr(nueva,7,2),substr(nueva,1,4)),formadoadecuado.), formatoadecuado tendrías que buscarlo en la ayuda de sas, y así de memoria tampoco estoy seguro de si es un put o un input lo que hace falta… ¿Soy el único que sigue dudando después de años? :P

  17. Por rvaquerizo, Jul 18, 2011 | Responder

    No tengo SAS ni WPS porque no me envían la licencia:

    data _null_;
    vieja=20JUL2011′d;
    nueva=(year(vieja)*10000+month(vieja))+day(vieja);
    run;

    Al contrario:

    http://analisisydecision.es/macros-sas-transformar-un-numerico-a-fecha/

    %macro numfecha(num);
    mdy(mod(int(&num./100),100),mod(&num.,100),int(&num./10000))
    %mend;

    data _null_;
    vieja=20110720;
    aux1=%numfecha(vieja);
    nueva=put(aux1,ddmmyy10.);
    run;

  18. Por José Antonio Gil Martín, Jul 18, 2011 | Responder

    De vieja a nueva:
    %let vieja=”20jul2011″d;
    %let nueva=%sysfunc(putn(&vieja, yymmddn8.));

    De nueva a vieja:
    %let nueva=20110720;
    %let vieja=”%sysfunc(putn(%sysfunc(inputn(&nueva, yymmdd8.)), date9.))”d;

  19. Por ffernandez, Jul 19, 2011 | Responder

    Creo que gana Jose Antonio, no se manipula nada en ningún caso, solo se cambia de formato, me apunto el putn e inputn. pensaba que inputn aplicaba sobre la representación interna de la fecha (número de días desde 1960…) y no sobre un número tipo 20110720.

  20. Por diana, Sep 7, 2011 | Responder

    Tengo un programa SAS con uma macro, dentro del programa le paso parametros a la macro, pero cuando ejecuto el programa desde visual basic 6 no se como pasarle los parametros al programa para q los tome la macro, alguna sugerencia??
    GRACIAS!

  21. Por rvaquerizo, Sep 8, 2011 | Responder

    Se me ocurre que la macro de VB genere el código SAS que vas a ejecutar y luego lo guarde como un archivo que puedas ejecutar desde SAS. También puedes mandar los parámetros a un fichero de texto para leerlos desde SAS.

  22. Por andres, Oct 19, 2011 | Responder

    Hola, tengo un problema, como puedo traspasar el formato de mes (“01JAN2009″d) a español (01ene2009)?.

  23. Por rvaquerizo, Oct 20, 2011 | Responder

    Hola andres. No te queda más remedio que hacerlo a mano, algo así:

    if month(fecha)=1 then fecha_esp = put(day(fecha,z2.)||”ENE”||put(year(fecha,4.);

    Saludos.

  24. Por ffernandez, Oct 20, 2011 | Responder

    También puedes utilizar la sentencia que te ha puesto Raúl para definir tu propio formato. Supongo que una búsqued en google de “SAS create your own formats” te ayudará.

  25. Por José Antonio Gil Martín, Oct 20, 2011 | Responder

    Buenas, también se puede usar lo siguiente:

    fecha=put(’01jan2009′d, eurdfde9.);

    esto crea una variable caracter de longitud 9 con el valor 01ene2009. El formato EURDFDE9. escribe el nombre del mes en español si la opción del sistema dflang= es el español, es decir:

    options dflang=spanish;

    Si no es así puedes usar el formato ESPDFDE9.
    Otros formatos que podrías usar son:

    FRADFDE9. –> nombre del mes en francés
    CATDFDE9. –> nombre del mes en catalán.

    Saludos

  26. Por ffernandez, Oct 21, 2011 | Responder

    No tenía ni idea de que existía eso del SAS NLS, la próxima sobre fechas me espero a la respuesta de Jose Antonio…

  27. Por rvaquerizo, Oct 21, 2011 | Responder

    No tenía ni idea de la existencia de esos formatos. Muy práctico. Gracias.

  28. Por Jose Luis, Jul 3, 2012 | Responder

    Que tal chicos, un favor, tengo uno de los problemas que se menciona arriba el de la diferencia de 10000, pero no logro aterrizar la idea.
    mi primer campo se llama fec_ini y es del tipo: 20120301
    mi segundo campo se llama fec_fin: 20120501
    no logro estraer la diferencia que seria: fec_fin-fec_ini = 3 meses

  29. Por José Antonio Gil Martín, Jul 4, 2012 | Responder

    José Luis puedes probar con esto:

    data _null_;
    fec_ini=’20120301′;
    fec_fin=’20120501′;
    fec_i=input(’20120301′, yymmdd10.);
    fec_f=input(’20120501′, yymmdd10.);
    intervalo_meses=intck(‘moth’,fec_i, fec_f);
    intervalo_dias=intck(‘day’,fec_i, fec_f);
    put intervalo_meses intervalo_dias;
    run;

    Saludos

  30. Por rvaquerizo, Jul 4, 2012 | Responder

    Una pregunta Jose Luis, esa diferencia que planteas no sería 2 meses 20120501 – 20120301 -> 2 meses ¿?

    Puedes leer:

    http://analisisydecision.es/monografico-funciones-intnx-e-intck-para-fechas-en-sas/

    http://analisisydecision.es/macros-sas-transformar-un-numerico-a-fecha/

    Y hacer:

    data uno;
    y=20120301;
    x=20120501;

    dif= intck(“month”,%numfecha(y),%numfecha(x));
    run;

    Saludos.

  31. Por Jose Luis, Ago 17, 2012 | Responder

    Muchas gracias JoséAntonio, quedo perfecto.un abrazo.

  32. Por Jose Luis, Ago 17, 2012 | Responder

    Excelente, quedo perfecto. Saludos

  33. Por Jose Luis, Ago 17, 2012 | Responder

    Muchas Gracias rvaquerizo, ya quedo listo, saludos

  34. Por Fernando, Ago 28, 2012 | Responder

    Estoy buscando el similar a
    SIFECHA(f.inicio,f.fin,’YM’)
    Que me regresa los meses que han pasado despues de los añs cumplidos.
    Alguien sabe si existe una formula similar para SAS?!

  35. Por Daniela, Oct 2, 2012 | Responder

    hola a todos.. necesito ayuda reurgente..en este momento me encuentro realizando un experiemento exactamente un bioensayo q consiste en una dosis y respuesta por parte de los individuos necesito calcular la dosis letal media pero llevo dias buscando el lenguaje de programacion para este tipo de ensayo. debo utilizar probit … gracias

  36. Por rvaquerizo, Oct 3, 2012 | Responder

    Hola Daniela, es una pregunta muy genérica esa que planteas. Pero en cuanto a software te recomiendo que utilices R. Tienes una gran cantidad de documentación y una lista de usuarios que podrá ayudarte.

    Un saludo.

  37. Por Emazcona, Oct 10, 2012 | Responder

    Hola rvaquerizo. Somos usuarios principiantes de Sas y estamos tratando de planificar proyectos a pesar de seguir todas las instrucciones de la ayuda no censseguimos que se ejecute un proycto muy sencillo (consulta y exporar a excel).

    Hemos probado de todo con el sas aierto, cerrado, etc. ¿que podemos estar olvidando?

  38. Por rvaquerizo, Oct 10, 2012 | Responder

    Hola. ¿Me puedes decir la versión de SAS con la que trabajas? ¿Utilizas Enterprise Guide? Saludos.

  39. Por Emazcona, Oct 11, 2012 | Responder

    Si. Efectivamente Enterprise Guide 4

  40. Por rvaquerizo, Oct 11, 2012 | Responder

    ¿No puedes abrir directamente el Excel en el proyecto de Guide?

    Intenta hacer un paso para importar datos de Excel a tabla SAS.

    Seguramente no tengas el módulo específico para importar ficheros de MS Office. Con Guide no es habitual.

  41. Por Emazcona, Oct 16, 2012 | Responder

    Si puedo. Lo hago habitualmente. El problema es que planificamos y no pasa nada. Ni ejecuta la consulta ni nada.

  42. Por rvaquerizo, Oct 16, 2012 | Responder

    Tienes la apertura del fichero como un paso de tu proyecto o bien tienes una importación a tabla SAS ¿?

Publica un Comentario