Macros SAS. Transformar un numérico a fecha

20 Nov

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:


data _null_;
 y=20070101;
 m=20080110;
 dif=m-y; put dif;
run;

En el log obtenemos que la diferencia entre estas 2 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 funciónes MOD para calcular el módulo e INT para obtener la parte entera de una operación:


data _null_;
 y=20080101;
 x=mdy(mod(int(y/100),100),mod(y,100),int(y/10000));
 put x= mmddyy10.;
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. Nos queda transformar esta operación en una macro de SAS que podamos emplearla 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= mmddyy10.;
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 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

5 respuestas a «Macros SAS. Transformar un numérico a fecha»

  1. He probado este truco y funciona pero no para el título de la entrada: «Transformar un numérico a fecha». Creo que es más bien al revés «Transformar una fecha a numérico».

    El caso es que no lo hemos entendido.

  2. El parámetro que le pasas a la macro es un número y lo que devuelve es un valor númerico fecha SAS.

    ¿Cuál es la diferencia de días entre 20081231 y 20090101?

    Si realizas esta operación con SAS obtendrás 8870:

    5 data _null_;
    6 dif=20090101 – 20081231;
    7 put dif=;
    8 run;

    dif=8870

    Sin embargo si realizas:

    9 %macro numfecha(num);
    10 mdy(mod(int(&num./100),100),mod(&num.,100),int(&num./10000))
    11 %mend;
    12
    13 data _null_;
    14 dif=%numfecha(20090101) – %numfecha(20081231);
    15 put dif=;
    16 run;

    dif=1

    La diferencia es 1. Luego lo que hace la macro es transformar un valor numérico en formato AAAAMMDD a un valor numérico fecha, es decir, transforma un numérico a fecha. Hace el equivalente a Oracle del TO_DATE(20081231,YYYYMMDD).

  3. Emplea la función DHMS.

    No puedo probarlo ahora mismo pero tiene que ser algo así:

    %macro numfecha(num);
    DHMS(mdy(mod(int(&num./100),100),mod(&num.,100),int(&num./10000)),0,0,0)
    %mend;

    Eso es en el caso de que no tengas horas porque cogería 00:00:00

Deja una respuesta

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