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.

Deixe uma resposta

O seu endereço de email não será publicado.