library(tidyverse)
library(lubridate)Treballar amb dates
La llibreria Lubridate
Lubridate és una llibreria que forma part de l’entorn Tidyverse i està especialitzada en el tractament i neteja de DATES.
Segueix la mateixa lògica que el Tidyverse i és molt fàcil enllaçar les seves funcions amb les apreses fins ara, però no forma part del core de Tidyverse.
Això implica que si volem utilitzar-la l’haurem de carregar a part amb library(lubridate) o, en cas de no tenir-la instal·lada: install.packages(lubridate).
El format
Moltes funcions d’R només permeten com a argument elements de la classe <date>. Per tant, si tenim un dataset que té una columna amb dates però no està amb la classe <date>, no podrem treballar-les usant aquestes funcions.
Fins ara el que hem vist és que per a transformar un vector o una columna a la classe <date> només cal aplicar-li la funció as.Date().
data <- "2024-12-03"
class(data)[1] "character"
data_corregida <- as.Date(data)
class(data_corregida)[1] "Date"
Els diferents formats de les dates
Les dates es poden presentar en formats molt diferents, però la funció as.Date() només funciona quan el format és YYYY-MM-DD (any-mes-dia).
data_format1 <- "2024-12-03"
as.Date(data)[1] "2024-12-03"
data_format2 <- "03-12-2024"
as.Date(data_format2)[1] "0003-12-20"
Transformar en data qualsevol format
ymd(): Transforma en classe<date>les dates amb el format Year-Month-Day.
data_ymd <- "2024-12-03"
ymd(data_ymd)[1] "2024-12-03"
class(ymd(data_ymd))[1] "Date"
dmy(): Transforma en classe<date>les dates amb el format Day-Month-Year.
data_dmy <- "03-12-2024"
dmy(data_dmy)[1] "2024-12-03"
mdy(): Transforma en classe<date>les dates amb el format Month-Day-Year.
data_mdy <- "12-03-2024"
dmy(data_mdy)[1] "2024-03-12"
Dates i hores
Un altre format recurrent en els datasets és el de data i hora en una mateixa cel·la. Per exemple: "2024-12-03 15:30:00".
Si volem quedar-nos només amb la data, podem transformar la string amb la funció as.Date():
as.Date("2024-12-03 15:30:00")[1] "2024-12-03"
Però si volem treballar tant amb la data com amb l’hora, podem transformar la string a la classe <POSIXct> / <datetime>.
Les funcions ymd_hms(), dmy_hms() i altres derivades com ymd_h(), mdy_hm() treballen amb aquest tipus de strings i les transformen a la classe <POSIXct>.
class(ymd_hms("2024-12-03 15:30:00"))[1] "POSIXct" "POSIXt"
ymd_hms("2024-12-03 15:30:00")[1] "2024-12-03 15:30:00 UTC"
ymd_hms("2024-12-03 15:30:00", tz="CET")[1] "2024-12-03 15:30:00 CET"
Extreure elements de les dates
La llibreria Lubridate també ofereix funcions que ens permeten treballar amb els components de les dates.
Per exemple, si volem crear una nova columna amb només els anys, podem utilitzar la funció year():
year("2024-12-03 15:30:00")[1] 2024
El mateix es pot aplicar a les funcions month(), day(), hour(), minute(), second() i fins i tot el dia de la setmana (wday()) o el dia de l’any (yday()).
wday("2024-12-03 15:30:00", label = TRUE)[1] Tue
Levels: Sun < Mon < Tue < Wed < Thu < Fri < Sat
Càlculs amb dates
El format <date> ens permet sumar i restar dates sense grans complicacions.
ymd("2024-12-03") + days(10)[1] "2024-12-13"
ymd("2024-12-03") - weeks(2)[1] "2024-11-19"
ymd("2024-12-03") + hours(3) + minutes(5)[1] "2024-12-03 03:05:00 UTC"
⚠️AVÍS: No confondre les funcions years(),months(), days(),weeks(),etc. amb les funcions en singular year(), month(), day()…
Arrodonir dates
Les dates també es poden arrodonir a conveniència amb les funcions floor_date(), ceiling_date() i round_date().
floor_date(ymd_hms("2024-12-03 15:30:25"), "hours")[1] "2024-12-03 15:00:00 UTC"
ceiling_date(ymd_hms("2024-12-03 15:30:25"), "day")[1] "2024-12-04 UTC"
Intervals de dates
Podem fixar intervals entre dues dates amb la funció interval() i respondre preguntes com:
- Quants dies / hores han passat?
- La data X es troba dins l’interval que té el dataset?
interval <- interval(ymd("2023-12-03"), ymd("2024-12-03"))
time_length(interval, "days")[1] 366
time_length(interval, "hours")[1] 8784
time_length(interval, "months")[1] 12
ymd("2024-05-03") %within% interval[1] TRUE