Trabajo con fechas SAS. Formatos de fecha SAS más utilizados

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

73 comentarios en “Trabajo con fechas SAS. Formatos de fecha SAS más utilizados

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

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

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

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

  5. Es equivalente, aunque un poco más rebuscado. Pero me sigue provocando curiosidad para qué la quieres en ese formato…

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

  7. Me gusta tener las fechas en formato numerico ya que soy matematico, eso de los caracteres me pone un poco nervioso, jejejeje

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

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

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

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

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

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

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

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

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

  17. 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!

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

  19. 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á.

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

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

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

  23. 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?!

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

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

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

  27. ¿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.

  28. Hola, necesito una función para comparar fechas algo como: si Fecha_inicio (en formato MM/DD/AAAA)> 01/015/2013 …
    Les agradezco mucho

  29. buenas tengo una base de dato con la fecha de nacimiento quisiera calcular la edad que tienen las personas actualmente utilizo el SAS Enterprise Guide, si pudieran ayudarme a como calcular la edad a la fecha

  30. Hola,
    Me gustaría saber cómo puedo cambiar el formato de fechas.
    Por ejemplo, tengo la fecha y formato
    end_date=’26NOV12:23:59:59’DT
    y me gustaría pasarla al formato:
    ’26NOV2012′
    ¿Cómo puedo hacerlo?
    Gracias,

  31. Datepart(end_date) as Fecha format date7.

    La variable que contiene la fecha con hora es end_date cambiala por el nombre de la varible que contiene tu fecha y as Fecha significa como lo vas a denominar ahora puede ser el mismo nombre inicial puede ser date7. o date9. cambia al final el año de 2 o 4 digitos

  32. Datepart(end_date) as Fecha format date7.

    La variable que contiene la fecha con hora es end_date cambiala por el nombre de la varible que contiene tu fecha y as Fecha significa como lo vas a denominar ahora, puede ser el mismo nombre inicial; el formato puede ser date7. o date9.; la diferencia es que al final de la fecha el año de 2 (yy) o 4 digitos (yyyy)

  33. Hola me gustaria saber como puedo sacar el minimo y el maximo (en dias) entre dos variables fecha con formato ddmmyy10.

  34. Siendo un poco mas explicito lo que necesito es MIN(vig_hasta,final), es decir, el minimo entre estas dos variables fecha con formato ddmmyy10.

  35. Buenos días… Alguien puede ayudarme con esto: tengo las fechas con el siguiente formato 01/01/2014 y necesito cambiarlo a 01-01-2014. Como puedo hacerlo? lo necesito para entregar un reporte donde me piden el formato con separación de guiones. Gracias!!

  36. Hola me gustaría saber como podría tomar la fecha de la máquina pues necesito generar un reporte diario y lo tengo automatizado salvo por la fecha que la debe cambiar a diario

  37. Hola!
    El campo en el archivo originar tiene el siguiente formato ” 5/24/2014 12:00 AM” y cuando se importa a SAS tiene la misma apariencia pero en formato alfanumerico. Yo necesito transformarlo a formato fecha, porque luego necesito extrer en un campo la fecha, en otro la hora y en otro los minutos.
    Estoy usando lo siguiente: put(date_log,MDYAMPM25.);run;
    pero no funciona, y me parece que es porque no encuentro el formato correcto.
    Podrian ayudarme por favor?

  38. Estimados por favor su ayuda necesito realizar la resta de 2 fechas pero el resultado debe tomarme en cuenta solo los dias laborables, existe alguna función en SAS que me permita realizar esta acción. Gracias por su ayuda.

  39. Hola me pueden ayudar, requiero sacar reportes con un usuario que se conectan a la DB de Oracle, pero necesito que la clave este oculta o encriptada cuando la coloque en el editor de SAS:

    %let USUARIO =’usuario’;
    %let CLAVE =’password’;

  40. Buenas tardes. Agradecería su ayuda con este problema.
    En una base tengo entre otros, los campos:
    -NSS (formato numérico $8.)
    -FECHA (formato date9.)
    -HORA (formato time8.)
    La base se encuentra ordenada de forma ascendente por el campo NSS y FECHA.

    Busco que si (NSS renglón N = NSS renglón N+1) Y (FECHA renglón N = FECHA renglón N+1) ENTONCES me de la diferencia entre la hora del renglón N y el renglón N+1.

    Gracias por su atención.

  41. Hola, tengo una variable fecha_nacimiento almacenada en texto de la siguiente manera ’15/07/2001′ por ejemplo; me gustaría transformarla a un formato fecha de SAS ddmmyy10. pero no soy capaz, si alguien puede ayudarme…

    Gracias!

  42. Hola, estoy empezando a usar SAS y quiero extraer de la fecha únicamente el mes en otra columna, pero no se como tengo que realizar el codigo.
    Tengo la tabla con varias columnas y el formato de fecha es este: 25MAY15:11:25:16

    Podrían ayudarme, por favor.

  43. Buenas tardes, a ver si me podéis echar una mano.

    Tengo una versión de SAS (4.3) que al darle a enviar a Excel (2010) los campos de fecha el Excel me los lee con formato personalizado, por lo que debo cambiar manualmente dichas columnas a formato fecha para que figure correctamente, en formato personalizado saldría del estilo 01MARyyyy, no sale el año.

    He probado a cambiar el formato de la fecha en SAS desde date a ddmmyy pero no hay manera, solo consigo que salga correctamente cuando en lugar de usar el botón de enviar uso el de exportar a Excel 97-2003.

    Muchas gracias por vuestra ayuda!

  44. Saludos, tengo una variable medida en el tiempo y necesito acumular dicha variable por períodos. Por ejemplo, el acumulado de junio a mayo durante 20 años.

  45. Estaba concatenando unas tablas, y el programa no me permitía ejecutar la tarea porque dos variables en las dos tablas que quiero concatenar tienen formato diferente. En una tabla aparece una numérica y la otra alfanumérica y en la otra al contrario. Quiero saber cómo puedo arreglar este problema, si se puede cambiar el formato de las variables?, cómo se hace esto?

  46. Hola a todo el mundo y en especial M.Vaquerizo por todo lo que nos aportas.
    Tengo una duda que es una tonteria pero por mas que hago no lo soluciono, es tan tonto como cambiar el formato 20081201 a 01/12/2008 ; si pongo
    “format DTNA ddmmyy10.;” Me coge bien el mes y el dia pero el año lo pone a 1960.
    Lo he de modificar para 70.000 observaciones
    He visto que daís diferentes alternativas pero no se como hacerlo para tantas fechas de en un mismo archivo
    Muchas gracias;
    PD: Vaya cantidad de gente que maneja tan bien el SAS

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *

[bws_google_captcha]