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 deseamos realizar una diferencia entre ellas:
data _null_;
y = 20070101;
m = 20080110;
dif = m - y;
put "Diferencia incorrecta: " dif;
run;
En el log obtenemos que la diferencia entre estas dos fechas es 10009; necesitamos transformarlas en variables numéricas pero del tipo fecha. Tenemos múltiples posibilidades para realizar esta transformación, pero en este caso voy a emplear la función de creación de fecha en SAS MDY(mes, día, año).
Para conseguir del valor AAAAMMDD el mes, el día y el año, emplearemos las funciones MOD para calcular el módulo e INT para obtener la parte entera de una operación:
data _null_;
y = 20080101;
* Obtenemos día, mes y año de un número YYYYMMDD;
dia = mod(y, 100);
mes = mod(int(y / 100), 100);
anio = int(y / 10000);
x = mdy(mes, dia, anio);
put x = ddmmyy10.;
run;
El mes es el resultado de quedarnos con el módulo 100 de AAAAMM, el día el módulo 100 de AAAAMMDD y el año es la parte entera de AAAAMMDD entre 10000. «Muy sencillo». Ya tenemos nuestra variable numérica con valor de fecha SAS.
Nos queda transformar esta operación en una macro de SAS que podamos emplear en nuestros programas sin necesidad de escribir toda la operación:
%macro numfecha(num);
mdy(mod(int(&num./100), 100), mod(&num., 100), int(&num./10000))
%mend;
data _null_;
y = 20080101;
x = %numfecha(y);
put x = ddmmyy10.;
run;
Una macro es «sustituir código SAS»; por ello podemos emplear esta macro como una función más:
data _null_;
y = 20070101;
m = 20080110;
dif = %numfecha(m) - %numfecha(y);
put "Diferencia en días: " dif;
run;
Espero que esta macro sea muy útil para el trabajo diario. Como siempre, si tenéis dudas, sugerencias o un trabajo bien retribuido… rvaquerizo@analisisydecision.es. Saludos.