Capítulo 9 Datas e tempo

Este capítulo pode ser visualizado neste vídeo.

Datas no R são representadas pela classe Date. Tempos são representados pelas classes POSIXct ou POSIXlt.

Internamente, as datas são armazenadas como o número de dias desde 01/01/1970. Horas são armazenadas como o número de segundos desde 01/01/1970.

9.1 Datas no R

Datas podem ser criadas por coerção de uma string de caracteres usando a função as.Date(). Se solicitarmos a ajuda para essa função (?as.Date), teremos mais detalhes sobre como essa função converte objetos para datas, seus argumentos, etc. Vamos ver aqui os usos mais simples dessa função.

Se usarmos essa função com uma string no formato “ano-mês-dia” ou “ano/mês/dia”, o resultado será um objeto do tipo Date que armazena a data especificada pela string. A data será exibida no formato ano-mês-dia.

## [1] "2019-03-01"

O argumento format permite ao usuário especificar como a data será construída. Por exemplo, no comando abaixo, o argumento format = “%m-%d-%Y” faz com que a data seja criada a partir do formato mês-dia-ano.

## [1] "2019-10-26"

A representação interna de um objeto da classe Date pode ser vista por meio da função unclass:

## [1] 17956

Vamos carregar o conjunto de dados stroke do pacote ISwR (GPL-2 | GPL-3), utilizado no capítulo 7.

Recordando, o conjunto de dados stroke contém 829 casos de AVC em Tartu, Estônia, durante o período 1991-1993, com seguimento até 1 de janeiro de 1996. Há duas variáveis da classe Date em stroke, died e dstr.

## [1] "Date"
## [1] "Date"

A variável dead de stroke é um vetor lógico que indica se o paciente morreu ou não durante o estudo.

É possível realizar as operações de adição e subtração com datas e tempos, e utilizar expressões lógicas (==, <=, >=, !=, >, <).

Por exemplo, se quiséssemos saber o número de dias desde o AVC até o óbito (caso o paciente tenha falecido) ou até o último dia de seguimento (“01/01/1996”), poderíamos utilizar o código a seguir:

O primeiro comando copia a variável dead de stroke para o objeto morto, que indica se cada paciente morreu ou não. O segundo comando irá contar o número de dias do AVC até o óbito para os pacientes que morreram. O cálculo somente será realizado para os pacientes que morrreram, por isso o objeto morto entre colchetes após a variável diasObs e na seleção das observações de stroke dentro do comando with.

O terceiro comando irá contar o número de dias do AVC até o óbito para os paciente que não morreram. O cálculo somente será realizado para os pacientes que não morrreram, por isso o objeto morto precedido do sinal de exclamação entre colchetes após a variável diasObs e na seleção das observações de stroke dentro do comando with.

A criação do objeto morto foi feita apenas para facilitar a compreensão dos comandos seguintes. Caso isso não fosse feito, os demais comandos deveriam ser escritos da seguinte forma:

A listagem a seguir mostra os 5 primeiros registros do conjunto de dados stroke com a variável diasObs acrescentada ao conjunto de dados:

##      sex age       dstr       died  dead diasObs
## 1   Male  76 1991-01-02 1991-01-07  TRUE       5
## 2   Male  58 1991-01-03       <NA> FALSE    1824
## 3   Male  74 1991-01-08 1991-06-02  TRUE     145
## 4 Female  77 1991-01-11 1991-01-13  TRUE       2
## 5 Female  76 1991-01-13       <NA> FALSE    1814

As classes de data e tempo no R cuidam de todos os detalhes sobre datas e horas, como anos bissextos, horários de verão e fusos horários. Abaixo é mostrado um exemplo onde um ano bissexto está envolvido e podemos observar que o número de dias entre as duas datas foi contado corretamente.

## Time difference of 2 days

9.2 Tempos no R

Tempos no R são representados pelas classes POSIXct ou POSIXlt. POSIXct é útil quando se deseja armazenar tempos em data frames, por exemplo.

POSIXlt é uma lista que armazena informações como o dia da semana, dia do ano, mês, dia do mês. Isso é útil quando precisamos deste tipo de informação.

Há um conjunto de funções genéricas que trabalham com datas e tempos para extrair partes de datas e/ou tempos, por exemplo:
- weekdays: fornece o dia da semana
- months: fornece o nome do mês
- quarters: fornece o número do trimestre (“Q1”, “Q2”, “Q3”, ou “Q4”)

Tempos podem ser criados por coerção de uma string, usando as funções as.POSIXlt ou as.POSIXct. O comando a seguir armazena no objeto x a hora do sistema por meio da função Sys.time. Vemos que x é da classe POSIXct.

## [1] "2021-12-09 21:45:52 -03"
## [1] "POSIXct" "POSIXt"

Um objeto da classe POSIXlt contém metadados úteis

## [1] "sec"  "min"  "hour" "mday" "mon"  "year" "wday" "yday"
## [1] "isdst"  "zone"   "gmtoff"
## [1] 4

Não se pode utilizar os metadados de POSIXlt com um objeto POSIXct. O código abaixo irá gerar uma mensagem de erro:

Error in x$sec : $ operator is invalid for atomic vectors

Já o código abaixo irá fornecer o valor desejado:

## [1] 52.43355

A função strptime recebe um vetor de caracteres que contêm datas e tempos e os converte em um objeto da classe POSIXlt.

## [1] "2019-06-13 11:40:00 -03" "2018-01-20 06:35:00 -02"
## [1] "POSIXlt" "POSIXt"

Os símbolos estranhos que aparecem no segundo argumento da função strptime (começando com “%”) fixam o formato de datas e tempos. Veja a ajuda da função strptime (?strptime) para saber como formatar uma string de data.

Não se deve realizar operações com uma mistura de objetos das classes Date, POSIXlt e POSIXct. O código abaixo irá gerar o seguinte erro:

Warning: Incompatible methods (“-.Date”, “-.POSIXt”) for “-” Error in x - y: non-numeric argument to binary operator

Se convertermos x acima para POSIXlt, a operação a seguir pode ser realizada:

## Time difference of 8.542882 days

Abaixo é mostrado um exemplo de uma operação com diferentes fusos horários:

## Time difference of 4 hours

O metadado year da classe POSIXlt mostra o ano, contando a partir de 1900. Assim se quiséssemos extrair o ano da variável dstr (data do AVC) do conjunto de dados stroke, devemos fazer:

## [1] 1991 1991 1991 1991 1991 1991

Há pacotes no R que facilitam o trabalho com datas e tempos, como o pacote lubridate.

9.3 Exercício

  1. Vamos utilizar o conjunto de dados udca do pacote survival (LGPL-2 | LGPL-2.1 | LGPL-3).

    1. Verifique a ajuda para o conjunto de dados.
    2. Carregue o conjunto de dados.
    3. Gere uma nova variável no conjunto de dados que contenha o tempo de observação de cada paciente em dias: tempo desde a entrada no estudo até a última visita. Verifique que a classe dessa variável é difftime.
    4. observe que se formos gerar resumos numéricos para esse tempo de observação via R Commander, essa variável não aparece na lista de variáveis numéricas. Converta essa variável para numérica, usando a função as.numeric.
    5. Renove o conjunto de dados e gere os resumos numéricos para o tempo de observação dos pacientes.