Bucle de fechas con SAS para tablas particionadas

20 Dic

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

[source languaje=»SAS»]
*IDENTIFICA EL ULTIMO DIA DE UN MES;
*IDENTIFICA EL ULTIMO DIA DE UN MES;
%macro finmes(fec);
intnx("month",&fec.,1)-1
%mend;

data bucle ;
do i=201501 to 201612;
if mod(i,100)=13 then i = i + 88;
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;
run;
[/source]

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.

4 respuestas a «Bucle de fechas con SAS para tablas particionadas»

  1. Buenas tardes:
    a ver si me puedes ayudar, lo que quiero es recorrer con el «do» dos periodos en vez de tener aaaammdd lo que tengo es aaaamm. Cuando llego a diciembre lo que quiero es que se posicione en Enero del año siguiente pero no me sale
    el código que tengo es:
    por ejemplo
    inicio = 1401
    fin =1501
    %Macro agrupo;
    %do year=&inicio. %to &fin.;
    %if mod(year/100) = 13 %then year =year +88;

    %mend;
    %agrupo;

    no funciona

    Espero haberme explicado correctamente

    Gracias anticipadas

    ….

    pero no me sale no hace caso

    gracias y un saludo,

  2. ya lo he resuelto, lo tenia mal en el código, al final combine la función eval para que si fuese el mes 12 incrementase a la fecha 88. y funciona!!

  3. Muchas gracias por el código, bastante útil, tengo una pequeña duda y es que al correr el código no me genera el mes de enero del año siguiente, es decir al correr me resulta:
    20150101 20150131
    20150201 20150228
    20150301 20150331
    20150401 20150430
    20150501 20150531
    20150601 20150630
    20150701 20150731
    20150801 20150831
    20150901 20150930
    20151001 20151031
    20151101 20151130
    20151201 20151231
    20160201 20160229
    20160301 20160331
    20160401 20160430,

    En este caso no está enero de 2016, me puedes ayudar que ajuste debería hacer para que se incluya esta fecha cuando se corre el código?
    Gracias

Deja una respuesta

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