Criado por Garrett Grolemund e Hadley Wickham, o pacote Lubridate foi criado com a intenção de facilitar a manipulação de datas e horas em uma determinada base de dados, como iremos ver a seguir o pacote é de grande utilidade para diversos problemas que encontramos no dia-a-dia, como: fusos, ordenação, contagem, dentre outros.
install.packages(“lubridate”)
library(lubridate)
Começaremos aprendendo algumas manipulações que são extremamente simples se usarmos o pacote, e que utilizam um codigo e funções muito mais trabalhosas no R base.
Criando uma data aleatória
date <- dmy("01-02-2019")
Com o comando “month”, o mês da data é retornado para o usuário
month(date)
## [1] 2
month(date, label = TRUE, abbr = FALSE)## Retorna o mês por extenso
## [1] fevereiro
## 12 Levels: janeiro < fevereiro < março < abril < maio < ... < dezembro
Da mesma forma para o ano e o dia, utilizando “year” e “day”
day(date)
## [1] 1
year(date)
## [1] 2019
“wday” nos retorna o dia da semana referente a data:
wday(date, label = TRUE, abbr = FALSE)
## [1] sexta
## 7 Levels: domingo < segunda < terça < quarta < quinta < ... < sábado
Podemos facilmente mudar expecificamente o dia, o mês ou o ano de uma data com comandos curtos e rápidos, como por exemplo: Mudando o dia 1 de fevereiro para o dia 5:
date <- date + days (4) ## Recebendo 4 dias
date
## [1] "2019-02-05"
Igualmente para alterarmos o mês ou o ano:
date <- date + months(4)## de fevereiro para junho
date<- date - years(1) ## 2019 para 2018
date
## [1] "2018-06-05"
A forma como o r te retornará o data selecionada, pode ser alterada de acordo com a vontade de cada um, abaixo uma tabela simples contém o comando para cada tipo de ordenação de data e hora(que veremos mais adiante) do pacote.
Ordem | Símbolo |
---|---|
Ano/Mês/Dia | ymd() |
Mês/Dia/Ano | mdy() |
Ano/Dia/Mês | ydm() |
Dia/Mês/Ano | dmy() |
Hora,Minuto | hm() |
Hora,Minuto,Segundo | hms() |
Ano/Mẽs/Dia, Hora,Minuto,Segundo | ymd_hms() |
Utilizaremos a funçãp hms para adicionar um horario
date <- ymd_hms("2018-02-01 10:00:00")
date
## [1] "2018-02-01 10:00:00 UTC"
Podemos mudar apenas o horário da data, mantendo os minutos e os segundo:
hour(date) <-12 ## Agora a hora é meio-dia
date
## [1] "2018-02-01 12:00:00 UTC"
De forma semelhante para os minutos e os segundos:
minute(date) <- 12
second(date) <- 12
date
## [1] "2018-02-01 12:12:12 UTC"
É sempre bom ficar atento as funções no singular e no plural, ao se adicionar ou subtrair horas minutos, dias , segundos entre outros, utilizamos a função no plural , já para substituição do horario ou dia usasse a função no singular.
Com o pacote Lubridate, conseguimos facilmente calcular um intervalo precisamente, para isso a principal funão usada é a que mescla horários e datas, ou seja, a função ymd_hms().
day1 <- ymd_hms("2019-02-10 10:30:15")
day2 <- ymd_hms("2019-02-7 12:12:12")
day3 <- day1 - day2
day3
## Time difference of 2.929201 days
A função now(), irá te retornar o exato momento em que o comando foi efetuado n próprio fuso horário
now()
## [1] "2019-03-26 14:39:00 -03"
A duração de um determinado evento pode ser retornada de forma simple com a utilização da função “new_duration”, como veremos a seguir:
duration(60)
## [1] "60s (~1 minutes)"
Pórem seria inviavél representar longas durações por meio de segundos, desse modo outras função podem ser utilizas, como por exemplo : ddays, dminutes, dweeks, dyears. Veremos a seguir na prática como isso funciona:
dminutes(4) ## Quantos segundos há em 4 minutos?
## [1] "240s (~4 minutes)"
dhours(8) ## Quantos segundos há em 8 horas?
## [1] "28800s (~8 hours)"
ddays(1) ## Quantos segundos há em um dia?
## [1] "86400s (~1 days)"
dyears(1) ## Quantos segundos há em um ano?
## [1] "31536000s (~52.14 weeks)"
Podemos adicionar qualquer duração ao objeto já criado anteriormente no R, como por exemplo adicionar 5 minutos no objeto “date”
date + dminutes(5)
## [1] "2018-02-01 12:17:12 UTC"
Também podemos identificar a duraçao de um objeto já criado utilizando a função as.duration
date2 <- interval(ymd("2018-01-01"), ymd("2019-01-01"))
as.duration(date2)
## [1] "31536000s (~52.14 weeks)"
Com o pacote Lubridate, podemos criar periodos de forma semelhante as durações, assim sendo, utilizamos o help das funções days(), weeks(), hours(), minutes(), years(),and seconds()
weeks(2) + days(2)
## [1] "16d 0H 0M 0S"
years(2) + days(2)
## [1] "2y 0m 2d 0H 0M 0S"
Ao se comparar as funções duração e período, percebemos que há uma semelhança muito grande em ambas, porém como os nomes mesmo já dizem, enquanto a duração trabalha com uma duração expecifica, o perido trabalha com períodos fechados, como por exemplo, em um ano bissexto, ao se adicionar dyears(1) somaremos 365 dias em uma analise, e não um ano como queremos, fato que não ocorre na função years(1), veremos a seguir.
bis <- ymd_hms("2012-01-01 13:00:00")
bis + dyears(1)
## [1] "2012-12-31 13:00:00 UTC"
bis + years(1)
## [1] "2013-01-01 13:00:00 UTC"
Trabalhar com fusos horários não é muito comum e nem muito interessante quando temos uma base de dados, porém podemos sim trabalhar com eles com o pacote lubridate, a nomeclatura mais utilizada é a (UTC) Universal time zone, a seguir utilizaremos a função with_tz para comerçarmos a trabalhar com fusos.
hoje <- now()
hoje
## [1] "2019-03-26 14:39:01 -03"
with_tz(hoje, "Europe/Istanbul") ## Passando o fuso de São Paulo para o de Istanbul
## [1] "2019-03-26 20:39:01 +03"
Com a função now(), podemos acessar a hora exata no seu e em difentes fusos horários, além de representar em qual fuso estamos atualmente em uma escala numérica.
Agora, ao contrário da função with_tz(), a função force_tz, altera o fuso horário do seu objeto, porém mantém o horário o mesmo.
hoje
## [1] "2019-03-26 14:39:01 -03"
force_tz(hoje, "Europe/Istanbul" )
## [1] "2019-03-26 14:39:01 +03"
Para saber todas as zonas que temos disponíveis no R, acessar o help da função Sys.timezone(), normalmente apenas com o comando OlsonNames(), já é possivél obter todas as zonas, pórem não é uma regra e pode variar de computador para computador.
Nesse post não entrarei a fundo a respeito utilização do pacote aplicado a gŕaficos e situações do cotidiano, foi apenas uma introdução a aplicação do pacote, viso que ele abrache muito mais do que eu poderia explicar em um único post.
CRAN : https://cran.r-project.org/web/packages/lubridate/vignettes/lubridate.html
BLOG : https://www.r-statistics.com/2012/03/do-more-with-dates-and-times-in-r-with-lubridate-1-1-0/
ARTIGO : https://www.jstatsoft.org/article/view/v040i03
GITHUB : https://github.com/hadley/lubridate