Articles

Usando os módulos de aprendizagem dates | SAS

lendo as datas em dados

Este módulo irá mostrar como ler as variáveis de Data, usar as funções de data e usar os formatos de visualização de datas em SAS. Assume-se que está familiarizado com os passos de dados para a leitura de dados em SAS, e instruções de atribuição para a computação de novas variáveis. Se algum dos conceitos é completamente novo, você pode querer olhar para mais informações abaixo para direções para outros módulos de aprendizagem. 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ários chamado de datas. Note que as datas são lidas na etapa de dados, e no formato data11. é usado 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 do proc de impressão é apresentado abaixo. Compare as datas nos dados com os valores de bday. Note que para John a data é 1 de Janeiro de 1960 e o valor para bday é 0. Isto é porque as datas são armazenadas internamente no SAS como o número de dias a partir de Jan 1,1960. Desde que Mary nasceu antes de 1960, o valor de bday 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, você teria que formatar a saída. Usamos o dato9. Formate to see dates in the form ddmmmyyyy. Isto é especificado em uma declaração de formato.

 PROC PRINT DATA=dates; FORMAT bday date9. ;RUN; 

Aqui está o resultado produzido pela declaraçã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 podiam ser lidas. Eles têm duas coisas em comum:

1) todos eles têm meses numéricos,
2) todos eles são ordenados mês, dia e ano.

John 1 1 1960Mary 07/11/1955Joan 07-11-1955Kate 11.12.1962Mark 06081959

Estas datas podem ser lidas com o mesmo formato, mmddy11. Segue-se um exemplo da utilização desse formato numa 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 do acima proc imprimir mostrar que todas as datas são lidos corretamente.

OBS NAME BDAY 1 John 01JAN1960 2 Mary 11JUL1955 3 Joan 11JUL1955 4 Kate 12NOV1962 5 Mark 08JUN1959

Há uma grande variedade de formatos disponíveis para utilização na leitura de datas para o SAS. Segue-se 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

Considere os seguintes dados, em que a ordem é a mês, ano e dia.

 7 1948 11 1 1960 110 1970 1512 1971 10 

pode ler estes dados com cada porção da data numa 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;

Notice the function mdy(month,day,year) in the data step. Esta função é usada para criar um valor de data a partir dos componentes individuais. Segue-se o resultado da impressão proc.

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

Dois dígitos datas

Considere os seguintes dados, que são o mesmo que acima, exceto que somente dois dígitos são usados para indicar o ano e o ano em que aparece pela última vez.

 7 11 18 7 11 48 1 1 6010 15 7012 10 71

a Leitura de dados é a mesma como nós fizemos.

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 do proc imprimir são apresentadas 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 de trabalho aqui porque SAS assume um ponto de corte (yearcutoff) antes que o valor de anos de dois dígitos são interpretados como os anos de 2000 e acima e, após os quais são interpretados como de 1999 e abaixo. O padrão yearcutoff é diferente para diferentes versões do SAS:

SAS 6.12 and before (YEARCUTOFF=1900)SAS 7 and 8 (YEARCUTOFF=1920)

As opções de declaração no programa que se segue altera o yearcutoff valor de 1920. Isso faz com que em dois dígitos menos de 20 anos para ser lido como após o ano 2000. Executando o mesmo programa, então irá produzir resultados diferentes quando esta opção estiver 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 do proc imprimir são apresentadas abaixo. A primeira observação é agora lida como ocorrendo em 2018 em vez 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

Cálculos com decorrido datas

SAS data de variáveis fazer cálculos envolvendo datas muito conveniente. 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 esse cálculo em contexto seguinte.

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 do proc imprimir são apresentadas abaixo. A variável AGE2000 agora contém 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

Há um número de funções úteis para usar com data de variáveis. Segue-se 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;

O proc imprimir os resultados são mostrados abaixo. As novas variáveis contêm o Mês, Dia, Ano, Dia da semana e 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

  • Datas de leitura com formatos de data, mais comumente date9. e mmddyy11.
  • Date functions can be used to create date values from their components (mdy (m,d, y)), and to extract the components from a date value (month (), day (), etc.).
  • a opção yearcutoff pode ser usada se você tiver que ler dois dígitos anos.

problemas para olhar para

  • as datas são misturadas dentro de um campo tal que nenhum formato de data única pode lê-las. Solução: leia o campo como um campo de caracteres, teste o texto, e use a função de entrada e formato apropriado para ler o valor na variável de data.
  • Não existe nenhum formato capaz de ler a data. Solução: leia a data como componentes e use uma função para produzir um valor de data.
  • às vezes o padrão para yearcutoff não é o padrão para a versão do pacote mencionado acima. Solucao: para determinar a configuração atual para yearcutoff simplesmente executar um programa contendo opções
    PROC = YEARCUTOFF; RUN;
    isto resultará em saída contendo o valor atual de yearcutoff.