datas

Diferença entre duas datas no SAS (em dias, meses ou anos)

Calcular a diferença entre duas datas no SAS é simples, basta subtrair uma data pela outra. Porém, se você quiser fazer a diferença em meses, anos, semanas ou alguma unidade do tipo, há duas escolhas: (1) realizar a subtração e depois dividir o valor pelo número de dias correspondentes ao período (ex.: dividir por 30 no caso de mês) ou (2) utilizar a função intck(). É desta segunda que vou falar neste post. (mais…)

Anúncios

Usando dia, mês e ano para formar uma data no SAS

Alguns dos posts mais visitados aqui são os de formatação de datas no SAS. Você pode ver Formatação de Datas no SAS e esse Convertendo diferentes formatos de data no SAS, como exemplos. Agora, vou mostrar uma outra função que eu desconhecia, a MDY( ). Ela é útil, pois além de intuitiva, serve para quando você tem que lidar com os campos dia, mês e ano, separados. No exemplo abaixo, temos uma coluna com o dia, outra com o mês e uma última com o ano. Vamos criar um campo no formato de data, na ordem mês, dia e ano: (mais…)

Convertendo diferentes formatos de data no SAS

Essa é intuitiva, mas não sei se todo mundo conhece. Então, se você leu Como calcular a diferença entre duas datas no SAS? e Formatando Datas no SAS, agora que já conseguiu criar colunas e mudar formato numérico para data, pode ainda querer trocar aquela data 20DEC2016 para 20/12/2016. Isso pode ser feito com o format:
*codigo que pega a tabela_old, com o campo data no formato 20DEC2016;
*e cria uma tabela nova chamada tabela_new com a data no formato 20/12/2016;
data tabela_new;
	set tabela_old;
 	format data ddmmyy10.;
run;

Utilizando datas dentro do seu script no SAS

Já falei de como trabalhar com datas no SAS em posts antigos, como em Formatando Datas no SAS. No entanto, nem sempre queremos trabalhar só com as datas que já estão nos nossos dados. Vamos supor que a gente queira trabalhar apenas com os alunos nascidos a partir de 31/01/1999 dos dados no post Como calcular a diferença entre duas datas no SAS?

Se você quiser pegar as informações cuja data é maior que 31/01/1999, os exemplos abaixo não funcionarão:

  1. if dt_nasc < “1999-01-31”;
  2. if dt_nasc < “31/01/1999”;

O SAS não vai entender que o que está à direita é uma data, para ele é um texto qualquer. Para trabalhar com essa data você precisaria utilizar as iniciais do mês e um d após o fechamento das aspas. No nosso exemplo, o que funcionaria seria:

if dt_nasc > "31jan1999"d;

Lembre-se que você deve colocar as iniciais do mês em inglês. Ou seja, para setembro, use “31sep2015″d ao invés de “31set2015″d!

Como calcular a diferença entre duas datas no SAS?

Novamente vou falar de datas no SAS. É sempre mais difícil trabalhar com datas em qualquer linguagem de programação. Por isso sempre que eu lembro de algo a respeito disso eu trato de escrever aqui porque acho que pode ajudar alguém. Dessa vez vamos aprender como descobrir a distância entre duas datas de algumas formas diferentes.

Voltando ao nosso exemplo dos alunos, nós já tínhamos suas notas e número de faltas, agora vamos acrescentar a data de nascimento deles:

data turma_1;
 input notas faltas dt_nasc ddmmyy10.; 
 format dt_nasc date9.; 
 datalines;
 3.6 13 20/02/1999
 3.6 15 15/04/1999
 5 9 02/10/1999
 6.4 8 01/05/1999
 6.6 7 10/03/1999
 6.6 8 12/11/1998
 6.8 8 14/08/1999
 7.5 5 23/02/1999
 8 4 30/07/1999
 8.7 3 08/03/1999
 9 1 24/02/1999
 9.5 1 15/11/1999
 ;
 proc print;
 run;

Veja como calcular a diferença entre as datas, primeiro de uma forma bem intuitiva apenas com a subtração entre a data de hoje e a do nascimento. Em seguida com as funções datdif e yrdif.

/*Acrescentando as colunas com diferença entre as datas*/
data Turma_1_v1;
    set Turma_1;
    dif_Dias=today()-dt_nasc;
    dif_Dias_2=datdif(dt_nasc,today(),'act/act');
    dif_Dias_3=datdif(dt_nasc,today(),'30/360');
    idade=yrdif(dt_nasc,TODAY());
run;

Como vocês podem ver, foram criados 3 campos utilizando fórmulas diferentes:

  1. Dif_Dias = Diferença entre o dia de hoje e a data de nascimento em dias;
  2. Dif_Dias2 = Diferença entre o dia de hoje e a data de nascimento em dias, utilizando o parâmetro ‘act/act’ para que o SAS entenda que a gente quer que o cálculo considere os dias reais entre as duas datas, considerando o número de dias que cada mês tem de acordo com o calendário;
  3. Dif_Dias3 = Diferença entre o dia de hoje e a data de nascimento em dias, utilizando como padrão que cada mês tem 30 dias e cada ano 360 dias. Isso pode ser útil para pessoas da área de finanças que precisam calcular retorno de alguns títulos;
  4. Idade = Diferença entre o dia de hoje e a data de nascimento em anos. Como não especificamos nada no terceiro parâmetro, o SAS nos traz a diferença considerando o calendário. O mesmo método utilizado em dif_dias poderia ter sido utilizado aqui.

Agora, ficou bem ruim essa idade com várias casas decimais. Eu recomendo trocar aquela linha por esse código com a função round:

idade=round(yrdif(dt_nasc,today()));

Função INTCK

Essa é mais uma função do SAS para lidar com datas, veja só como é intuitiva:

data Turma_1_v2;
set Turma_1;
    dif_meses=intck('month',dt_nasc,today());
    dif_anos=intck('year',dt_nasc,today());
    dif_dias=intck('day',dt_nasc,today());
    dif_semestres=intck('semiyear',dt_nasc,today());
    dif_trimestres=intck('qtr',dt_nasc,today());
run;

Nota: Se você estiver comparando duas datas do mesmo ano, dif_anos retornará zero. O mesmo vale para os demais. Caso você se confunda e coloque a data mais recente antes da data mais antiga, você receberá valores negativos (o que é intuitivo mas vale lembrar).