Archivo de la etiqueta: fechas sas

Bucle de fechas con SAS para tablas particionadas

Partimos de un mes inicial hasta un mes final es necesario crear una tabla SAS con dos variables, el inicio del mes y el final del mes. Trabajo con fechas en SAS que todos sabemos es una tarea un "poco ardua".  El título de la entrada también es un poco peculiar pero es la respuesta a la duda que planteaba un lector:

Cogemos dos fechas en formato yyyymmaa
Ej: 20150101 a 2016131

Necesito una salida como la siguiente
20150101   20150131
20150201   20150228
20150301   20150331
20150401   20150430
.

20161101  20161130
20161201  20161231

Pero para que los datos pedidos en este periodo salgan en una tabla por mes con un proc sql  ya diseñado que funciona pero sin particionarlo en una tabla por mes en el log

Se me han ocurrido varias formas de hacerlo pero a continuación os planteo la siguiente. Como referencia hemos de irnos a una entrada anterior del blog, una entrada del 2008 cuando puse en marcha analisisydecision.es

*IDENTIFICA EL ULTIMO DIA DE UN MES;
%macro finmes(fec);
intnx("month",&fec.,1)-1
%mend;


data bucle (drop=i);
do i=201501 to 201612;
    if mod(i,100)=13 then i = i + 88;
else do;
    inicio = i * 100 + 1;
    *PRIMERO TRANSFORMAMOS EN FECHA SAS;
    fin = mdy(mod(i,100),1,int(i/100));
    *DESPUES OBTENEMOS EL ULTIMO DIA DEL MES;
    fin = %finmes(fin);
    *POR ULTIMO LO TRANSFORMAMOS A NUMERICO;
    fin = year(fin)*10000+month(fin)*100+day(fin);
    output;
end;
end;
run;

Lo he hecho de una forma sencilla, se trata de un bucle DO desde el mes inicial a el mes final, en realidad son unos 90 números sin embargo si el módulo del número, el mes, está entre 1 y 12 entonces identifica el primer día del mes e identifica el último día del mes transformando el número a fecha SAS primero, obteniendo el último día después y por último lo transforma del modo más sencillo a un número que pueda entender la partición. Es un bucle SAS susceptible de ser parametrizado. Saludos.

Trucos SAS. Pasar fecha a caracter en SAS

Pasar números a carácter en SAS es un tema reiterativo tanto en entradas al blog como en búsquedas. Pero que se le puede dar otra vuelta de tuerca. Se trata de transformar fechas a variables alfanuméricas, pero en este caso vamos a poner las fechas en formato español. Ejecutad este ejemplo en SAS:

data uno;
y = '30jan11'd;
c0 = put(y,ddmmyy10.);
c1 = upcase(put(y,ESPDFDD.));
c2 = upcase(put(y,ESPDFDE.));
c3 = upcase(put(y,ESPDFDN.));
c4 = upcase(put(y,ESPDFDT.));
c5 = upcase(put(y,ESPDFDWN.));
c6 = upcase(put(y,ESPDFMN.));
c7 = upcase(put(y,ESPDFMY.));
c8 = upcase(put(y,ESPDFWDX.));
c9 = upcase(put(y,ESPDFWKX.));
run;

Imagino que todos tenéis el NLS de SAS instalado y no tenéis problemas con estos formatos. Resumamos que nos ofrece cada una de estas transformaciones:

  • DDMMYY10 es el más habitual y nos genera 30/01/2011 podemos jugar con la longitud
  • ESPDFDD genera 30.01.2011 un formato que personalmente utilizo mucho
  • ESPDFDE genera 30ENE2011 probablemente el más habitual
  • ESPDFDN genera un 7, la semana del año
  • ESPDFDT genera un fecha-hora con formato español, en este caso no tiene mucho sentido
  • ESPDFDWN nos pone el día de la semana, domingo
  • ESPDFMN nos pone el mes, enero
  • ESPDFMY genera ENE11, práctico para sumarizaciones
  • ESPDFWDX genera 30 DE ENERO DE 2011
  • ESPDFWKX genera DOMINGO, 30 DE ENERO DE 2011 un formato que no he usado nunca

Estos formatos SAS los conozco gracias a un lector del blog. Al César lo que es del César. Aquí aprendemos todos.  Es interesante recogerlos todos juntos para que esta entrada quede como una referencia de la transformación de fechas en textos en SAS. Saludos.

Trucos SAS. Número de días de un mes

Están entrando muchas visitas con las palabras "número de días de un mes en SAS". Y hoy vamos a dar respuesta a estas entradas con una macro y un truco de SAS. Si tenemos una fecha en formato AAAAMM numérica, típica de las particiones de Oracle, disponemos de la siguiente macro:


%macro dias(mes);
*VARIABLES AÑO Y MES;
%let y=%sysfunc(int(&mes./100));
%let m=%sysfunc(mod(&mes.,100));
*TRATAMIENTO ESPECIAL PARA LOS DICIEMBRES;
%if &m.=12 %then %do;
%let m1=1;
%let y1=%eval(&y.+1);
%end;
%else %do;
%let m1=%eval(&m.+1);
%let y1=&y.;
%end;
*01/MES MAS 1 - 01/MES;
%let ini=%sysfunc(mdy(&m.,1,&y.));
%let fin=%sysfunc(mdy(&m1.,1,&y1.));
%let dias=%eval(&fin.-&ini.);
*AL FINAL LA MACRO SOLO DEVUELVE UN NUMERO;
&dias.;
%mend;
*EJEMPLO DE USO;
data _null_;
pepin=%dias(200402);
put pepin;
run;

Ejemplo muy sencillo de código macro y que se entiende muy facilmente, como siempre recomiendo que copiéis y peguéis en vuestro SAS y lo entenderéis enseguida. El caso es que calculo el número de días de un mes como la diferencia entre el día 1 del mes en estudio frente al día 1 del mes mas 1 en estudio. Si disponemos de una fecha SAS recomiendo usar la función INTNX para determinar el número de días del mes, ejemplo:


data _null_;
fecha="02FEB2004"d;
fin_mes=intnx('month',fecha,0,'end');
dias=day(fin_mes);
put fin_mes dias;
run;

Buena referencia de uso de INTNX. Espero que os sirva de ayuda. Saludos.

Macros SAS. Primer y último día del mes de una fecha SAS

Me debo a vosotros, mis lectores. Y he tenido visitas que buscaban como obtener el primer y el último día de un mes con SAS. Como Análisis y Decisión es una web personalizada voy a dar respuesta a esas búsquedas. Para ello tengo os planteo dos macros de SAS, además nos servirán para entender mejor la función INTNX para operar con fechas. El siguiente ejemplo parte de la necesidad de obtener, dada una fecha, el primer y último día del mes de la fecha dada:

data _null_;
format x y z date9.;
y="12JUN08"d;
*ULTIMO DÍA DEL MES EN FUNCION DE LA FECHA;
x=intnx("month",y,1)-1;
put x;
PRIMER DÍA DEL MES EN FUNCION DE LA FECHA;
z=intnx("month",y,0);
put z=;
run;

Sigue leyendo Macros SAS. Primer y último día del mes de una fecha SAS

Macros SAS. Transformar un numérico a fecha

A continuación vamos a plantear una macro de SAS bastante sencilla que nos permitirá transformar valores numéricos del tipo 20080607, fechas en formato AAAAMMDD pero que son numéricas, a valores fecha en SAS que nos permitirán realizar operaciones. Siguiendo el sistema de todos los mensajes de AyD trabajaremos con ejemplos para estudiar su utilidad.

Partimos de dos fechas en formato AAAAMMDD y desamos realizar una diferencia entre ellas: Sigue leyendo Macros SAS. Transformar un numérico a fecha

Trabajo con fechas SAS. Funciones fecha

En las entregas anteriores del monográfico sobre fechas SAS hemos estudiado como almacena internamente las fechas el sistema y los formatos más prácticos que disponemos para visualizarlas. En esta última entrega veremos algunas de las funciones de fecha hora de las que dispone SAS. Las funciones las vamos a dividir en 4 grupos:

  • Funciones de extracción de fecha
  • Funciones de creación de fecha
  • Funciones de duración
  • Funciones de intervalo

Sigue leyendo Trabajo con fechas SAS. Funciones fecha

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. Sigue leyendo Trabajo con fechas SAS. Formatos de fecha SAS más utilizados