Trabalhando com datas

Porque ninguém segue um padrão?

Trabalhar com planilhas complexas é uma tarefa mais ou menos estressante, trabalhar com planilhas complexas de outras pessoas é algo que testa a paciência de qualquer um e mais impressionante ainda é o fato de que nunca duas pessoas diferentes utilizam a mesma formatação para datas.

Se fosse existir uma competição para eleger o tipo de dados mais esquizofrênico, certamente as datas venceriam.

  • Texto é texto sempre…
  • Números, apesar de alguns problemas com separadores decimais e de milhar, ok…
  • Datas, existem várias formas de se representar o primeiro dia de fevereiro de 2015
  1. 01/02/2015
  2. 02/01/2015
  3. 01/02/15
  4. ½/15
  5. 2/1/15
  6. 01-fev-2015
  7. 2015-02-01

E por aí vai…Pode ficar pior ainda…Uma vez recebi uma base de dados temporais onde as datas estavam em espanhol mas estavam configuradas como texto ao invés de data…

Para nós que moramos no Brasil a impressão que temos é que é pior ainda, pois é comum um vetor de dados ser interpretado como m/d/a e fazer a maior confusão com as datas, pois o computador ‘pensa’ que a data é m/d/a e nós interpretamos como d/m/a, isso é especialmente confuso para os dias menores que 13.

12/02/15 é diferente de 12/02/15 (12/fev/15 != 02/dez/15)

Mais lenha na fogueira – Horas e fusos

Horas e fusos servem para atrapalhar ainda mais já que aqui costumamos utilizar as horas até 24 ao invés de AM/PM e eu não me lembro de utilizar fusos em nenhum programa que não seja o R.

Datas no R

Como o R trabalha com diferentes tipos de objetos ele faz um ótimo trabalho em complicar as coisas ainda mais. Vamos dar uma olhada como as datas funcionam no R

Primeiro vamos olhar para como ele nos trás as datas de hoje

Sys.Date()
## [1] "2015-07-10"
Sys.time()
## [1] "2015-07-10 09:16:23 BRT"
class(Sys.Date())
## [1] "Date"
class(Sys.time())
## [1] "POSIXct" "POSIXt"

Olha só que alegria…!!! Dois comandos que são razoavelmente semelhantes são considerados como dois objetos praticamente diferentes!!!

Classes POSIXct e POSIXlt são classes que representam datas e horas juntos e de acordo com a descrição de ambas no pacote básico do R, ‘POSIXct’ é mais conveniente para incluir em data.frames e ‘POSIXlt’ é mais próximo de formatos legíveis para humanos!!! A classe POSIXct é o número de segundos desde 1970 até a data/hora e POSIXlt é uma lista nomeada que representa diversos elementos.

Que?

É isso aí! Vamos ver abaixo como o R interpreta datas

  1. POSIXct – Número de segundos depois 1970
data <- as.POSIXct(Sys.time())
names(data)
## NULL
is.list(data)
## [1] FALSE
str(unclass(data))
##  num 1.44e+09
  1. POSIXlt – Lista de diversos elementos ‘data’
data <- as.POSIXlt(Sys.time())
names(data)
## NULL
is.list(data)
## [1] TRUE
str(unclass(data))
## List of 11
##  $ sec   : num 24
##  $ min   : int 16
##  $ hour  : int 9
##  $ mday  : int 10
##  $ mon   : int 6
##  $ year  : int 115
##  $ wday  : int 5
##  $ yday  : int 190
##  $ isdst : int 0
##  $ zone  : chr "BRT"
##  $ gmtoff: int -10800
##  - attr(*, "tzone")= chr [1:3] "" "BRT" "BRST"

Convertendo ‘coisas’ em datas

Devido ao número de opções que temos para datas vamos classificar aqui no blog como ‘coisas’ e vamos puxar um vetor de ‘coisas’ do nosso post anterior.

https://dadosdadosdados.wordpress.com/2015/07/04/tesouro-direto-do-excel-para-o-r-2/

No caso do data.frame ‘MASTER’ que criamos naquele post o vetor ‘Dia’ contém todas as datas, porém em formatos diferentes

Vamos ver o que temos

str(MASTER$Dia)
##  chr [1:18393] "2002-01-02 00:00:00" "2002-01-03 00:00:00" ...
head(MASTER$Dia,3)
## [1] "2002-01-02 00:00:00" "2002-01-03 00:00:00" "2002-01-04 00:00:00"
tail(MASTER$Dia,3)
## [1] "24/06/2015" "25/06/2015" "26/06/2015"

Note que temos, um vetor de caracteres(chr) que começa com um formato e termina com outro. Pelo post anterior, nós sabemos que são somente esses dois formatos (pre 2012 e pós 2012), então vamos ver o que dá para fazer com o que temos.

Usar:
MASTER$Dia[1]-MASTER$Dia[1]

Retorna:
“Error in MASTER$Dia[1] – MASTER$Dia[1] :
non-numeric argument to binary operator”

Não é possível subtrair ‘palavras’…

Temos que converter isso em objetos POSIXct ou lt para poder brincar com isso.

Vamos criar duas variáveis

data1 <- head(MASTER$Dia,1)
data2 <- tail(MASTER$Dia,1)
data1
## [1] "2002-01-02 00:00:00"
data2
## [1] "26/06/2015"

as.POSIX

as.POSIXct(data1)
## [1] "2002-01-02 BRST"
as.POSIXct(data2)
## [1] "0026-06-20 LMT"

A primeira data até que ele entendeu, a segunda não…

No final das contas, temos que contar para o R o que estamos passando nas funções de conversão de datas. Temos que dar uma dica para ele poder funcionar corretamente.

strptime

strptime(data1, '%Y-%m-%d %T')
## [1] "2002-01-02 BRST"
strptime(data2, '%d/%m/%Y')
## [1] "2015-06-26 BRT"

Aê! Converteu, mas o que é o segundo argumento que passamos na função ‘strptime’?

Para cada formato de data diferente temos que explicar para o R o que vai dentro da fórmula, no caso de “2002-01-02 00:00:00” passamos:

  • %Y (ano com século)
  • %m (mês com decimal…note que %M é minuto com decimal)
  • %d (dia com decimal)
  • %T (%H:%M:%S)
  • cada um desses parâmetros separado por ‘-‘

Para a outra data “26/06/2015”

  • %d (dia com decimal)
  • %m (mês com decimal)
  • %Y (ano com século)

Não vamos nem gastar muito tempo nisso, pois além de existirem trocentas classificações diferentes, existem outras maneiras mais fáceis de se trabalhar com datas no R.

Caso você tenha curiosidade a lista completa pode ser vista no link:

https://stat.ethz.ch/R-manual/R-devel/library/base/html/strptime.html

No próximo post, vamos falar um pouco sobre o ‘lubridate’ que é um pacote que facilita um pouco o trabalho com datas, afinal ninguém merece ficar decorando as especificações de conversão de datas…

Advertisements

One thought on “Trabalhando com datas

  1. Pingback: Trabalhando com datas II – Lubridate | Dados Dados Dados

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s