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.
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,
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!!
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
traspuse una x cantidad de campos y ahora deseo concatenarlos ej:
campo1 campo2 campo3 …….