Lendo datas em dados
Este módulo mostrará como ler variáveis de data, usar funções de data e usar formatos de exibição de data no SAS. Presume-se que você esteja familiarizado com as etapas de leitura de dados em SAS e com as instruções de atribuição para o cálculo de novas variáveis. Se qualquer um dos conceitos for completamente novo, você pode querer olhar para Para mais informações abaixo para direções para outros módulos de aprendizado. O arquivo de dados usado no primeiro exemplo é apresentado a seguir.
John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959
O programa abaixo lê os dados e cria um arquivo de dados temporário chamado datas. Note que as datas são lidas na etapa de dados, e a data de formato11. é usada para ler a data.
DATA dates; INPUT name $ 1-4 @6 bday date11.;CARDS;John 1 Jan 1960Mary 11 Jul 1955Kate 12 Nov 1962Mark 8 Jun 1959;RUN;PROC PRINT DATA=dates;RUN;
A saída da impressão do proc é apresentada abaixo. Compare as datas nos dados com os valores de bday. Note que para John a data é 1 Jan 1960 e o valor para bday é 0. Isto é porque as datas são armazenadas internamente na SAS como o número de dias a partir de 1 Jan 1960. Desde que Maria nasceu antes de 1960 o valor de dia para ela é negativo (-1635).
OBS NAME BDAY 1 John 0 2 Mary -1635 3 Kate 1046 4 Mark -207
Para ver as datas de uma forma que entendemos que você teria que formatar a saída. Nós usamos o formato date9. para ver as datas no formato ddmmmyyyy. Isto é especificado em uma declaração de formato.
PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Aqui está a saída produzida pela instrução de impressão proc acima.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Kate 12NOV1962 4 Mark 08JUN1959
Vejamos os seguintes dados. À primeira vista, parece que as datas são tão diferentes que não puderam ser lidas. Elas têm duas coisas em comum:
1) todas elas têm meses numéricos,
2) todas elas são ordenadas mês, dia e depois ano.John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959
Estas datas podem ser lidas com o mesmo formato, mmddyyy11. Segue um exemplo do uso desse formato em uma etapa de dados.
DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Os resultados da impressão do proc acima mostram que todas as datas são lidas corretamente.
OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959
Existe uma grande variedade de formatos disponíveis para uso na leitura de datas no SAS. A seguir, uma amostra de alguns desses formatos.
Informat Description Range Width Sample-------- ----------- ----- ------- ------JULIANw. Julian date 5-32 5 65001 YYDDDDDMMYYw. date values 6-32 6 14/8/1963MONYYw. month and year 5-32 5 JUN64YYMMDDw. date values 6-32 8 65/4/29YYQw. year and quarter 4-32 4 65Q1
Consulte os seguintes dados em que a ordem é mês, ano e dia.
7 1948 11 1 1960 110 1970 1512 1971 10
Você pode ler estes dados com cada parte da data em uma variável separada, como no passo de dados que se segue.
DATA dates; INPUT month 1-2 year 4-7 day 9-10; bday=MDY(month,day,year);CARDS; 7 1948 11 1 1960 110 1970 1512 1971 10;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Note a função mdy(mês,dia,ano) no passo de dados. Esta função é usada para criar um valor de data a partir dos componentes individuais. O resultado da impressão do proc é o seguinte.
OBS MONTH YEAR DAY BDAY 1 7 1948 11 11JUL1948 2 1 1960 1 01JAN1960 3 10 1970 15 15OCT1970 4 12 1971 10 10DEC1971
Datas com dois dígitos
Consulte os seguintes dados, que são os mesmos acima, exceto que apenas dois dígitos são usados para significar o ano, e o ano aparece por último.
7 11 18 7 11 48 1 1 6010 15 7012 10 71
Ler os dados é o mesmo que acabamos de fazer.
DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Os resultados da impressão do proc são mostrados abaixo.
OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL1918 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971
Dois dígitos anos trabalham aqui porque SAS assume um corte (anocutoff) antes do qual o valor dois dígitos anos são interpretados como o ano 2000 e acima e após o qual são interpretados como 1999 e abaixo. O ano de corte padrão difere para diferentes versões do SAS:
SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)
A declaração de opções no programa que se segue muda o valor do ano de corte para 1920. Isto faz com que em anos de dois dígitos inferiores a 20 seja lido como após o ano 2000. Executando o mesmo programa então produzirá resultados diferentes quando esta opção for definida.
OPTIONS YEARCUTOFF=1920;DATA dates; INPUT month day year ; bday=MDY(month,day,year);CARDS; 7 11 18 7 11 48 1 1 6010 15 7012 10 71;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Os resultados da impressão do proc são mostrados abaixo. A primeira observação é agora lida como ocorrendo em 2018 ao invés de 1918.
OBS MONTH DAY YEAR BDAY 1 7 11 18 11JUL2018 2 7 11 48 11JUL1948 3 1 1 60 01JAN1960 4 10 15 70 15OCT1970 5 12 10 71 10DEC1971
Computações com datas decorridas
Variáveis de data da SAS tornam os cálculos envolvendo datas muito convenientes. Por exemplo, para calcular a idade de todos em 1 de janeiro de 2000, use a seguinte conversão na etapa de dados.
age2000=(mdy(1,1,2000)-bday)/365.25 ;
O programa com este cálculo no contexto segue.
OPTIONS YEARCUTOFF=1900; /* sets the cutoff back to the default */DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; age2000 = (MDY(1,1,2000)-bday)/365.25 ;CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; FORMAT bday date9. ;RUN;
Os resultados da impressão do proc são mostrados abaixo. A variável AGE2000 contém agora a idade em anos a partir de 1 de Janeiro de 2000.
OBS NAME BDAY AGE2000 1 John 01JAN1960 40.0000 2 Mary 11JUL1955 44.4764 3 Joan 11JUL1955 44.4764 4 Kate 12NOV1962 37.1362 5 Mark 08JUN1959 40.5667
Outras funções de data úteis
Existem várias funções úteis para uso com variáveis de data. A seguir está uma lista de algumas dessas funções.
Function Description Sample-------- --------------------- -----------------month() Extracts Month m=MONTH(bday);day() Extracts Day d=DAY(bday) ;year() Extracts Year y=YEAR(bday);weekday() Extracts Day of Week wk_d=WEEKDAY(bday);qtr() Extracts Quarter q=QTR(bday);
O programa a seguir demonstra o uso dessas funções.
DATA dates; INPUT name $ 1-4 @6 bday mmddyy11.; m=MONTH(bday); d=DAY(bday) ; y=YEAR(bday); wk_d=WEEKDAY(bday); q=QTR(bday);CARDS;John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959;RUN;PROC PRINT DATA=dates; VAR bday m d y; FORMAT bday date9. ;RUN;PROC PRINT DATA=dates; VAR bday wk_d q; FORMAT bday date9. ;RUN;
Os resultados da impressão do proc são mostrados abaixo. As novas variáveis contêm o mês, o dia, o ano, o dia da semana e o trimestre.
OBS BDAY M D Y 1 01JAN1960 1 1 1960 2 11JUL1955 7 11 1955 3 11JUL1955 7 11 1955 4 12NOV1962 11 12 1962 5 08JUN1959 6 8 1959OBS BDAY WK_D Q 1 01JAN1960 6 1 2 11JUL1955 2 3 3 11JUL1955 2 3 4 12NOV1962 2 4 5 08JUN1959 2 2
Resumo
- As datas são lidas com formatos de data, mais comumente data9. e mmddyy11.
- Funções de data podem ser usadas para criar valores de data a partir dos seus componentes (mdy(m,d,y)), e para extrair os componentes de um valor de data (mês(),dia(), etc.).
- A opção anocutoff pode ser usada se você tiver que ler anos de dois dígitos.
Problemas a ter em conta
- As datas são misturadas dentro de um campo de modo a que nenhum formato de data possa lê-las. Solução: Ler o campo como um campo de caracteres, testar a string e usar a função de entrada e o formato apropriado para ler o valor na variável de data.
- Não há um formato capaz de ler a data. Solução: ler a data como componentes e usar uma função para produzir um valor de data.
- Às vezes o valor padrão para o anocutoff não é o padrão para a versão do pacote mencionado acima. Solução: para determinar a configuração atual para o anocutoff simplesmente execute um programa contendo
PROC OPTIONS OPTION=YEARCUTOFF; RUN;
Isto resultará na saída contendo o valor atual do anocutoff.