class: center, middle, inverse, title-slide # Packages lubridate et hms ## Cours FAS-1002 ### Gabrielle Desrosiers-Brisebois ### 2021-11-23 --- background-position: 900px 475px background-image: url("images/logo_tidyverse.png") background-size: 150px ## Pourquoi des packages réservés aux dates et aux heures ? -- .center["*Makes working with dates fun instead of frustrating* "] -- - Pour nettoyer et harmoniser des données, car il y a plusieurs façons différentes d'inscrire des dates dans une banque de données : ```r date1 <- "2021-11-23" #format standard date2 <- "11-23-2021" date3 <- "11/23/2021" date4 <- "11232021" date5 <- "23-Nov-2021" date6 <- "2021-11-23 16:30:50" #format standard date7 <- "23-11-2021 16,30,50" ``` -- - Pour créer et transformer des données en format date/heure. -- - Pour effectuer des opérations mathématiques. -- - Pour harmoniser des données provenant d'autres fuseaux horaires. --- # Les types de variables de temps dans R : -- ### _Date_ : - Lorsque les observations contiennent seulement des dates et pas de temps. -- ### _POSIXct_ _(calendar time)_ : - Enregistre l'information en secondes à partir du 1er janvier 1970. -- ### _POSIXlt_ _(local time)_ : - Enregistre l'information de manière séparée dans le format classique (année-mois-jour heure-minute-seconde). - Différences entre _POSIXct_ et _POSIXlt_ sont perceptibles avec la fonction `unclass()`. --- background-position: 800px 50px background-image: url("images/logo_bixi.png") background-size: 300px # Banque de données [BIXI Montréal](https://bixi.com/fr/donnees-ouvertes) Données ouvertes pour le mois d'**octobre 2021**. <br> La banque de données contient **6 variables** et un total de **752 003 observations**. <br> Les manipulations seront enregistrées dans la nouvelle banque de données `bixi_new`. ```r bixi <- read.csv("dataset/OD_2021_10_5.csv") bixi_new <- bixi ``` <table class="table" style="font-size: 12px; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Banque de données BIXI</caption> <thead> <tr> <th style="text-align:left;"> start_date </th> <th style="text-align:right;"> emplacement_pk_start </th> <th style="text-align:left;"> end_date </th> <th style="text-align:right;"> emplacement_pk_end </th> <th style="text-align:right;"> duration_sec </th> <th style="text-align:right;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 06:21:22.587 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32.601 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 23:46:25.598 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39.080 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 17:47:51.820 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53.412 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 17:36:00.790 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39.598 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 15:44:51.014 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58.763 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 16:51:43.357 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40.679 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table> --- class: center, middle # `lubridate`<br>`hms` [<img src="images/logo_lubridate.png" width="150"/>](https://lubridate.tidyverse.org/) [<img src="images/logo_hms.png" width="150"/>](https://hms.tidyverse.org/) ```r library(lubridate) library(hms) ``` --- # Les données date/temps dans `lubridate` et `hms` -- ### _hms_ : - Un objet de temps qui correspond au nombre de secondes écoulées depuis 00:00:00. ```r hms::as_hms(90) ``` ``` ## 00:01:30 ``` -- ### _date_ : - Un moment précis (année-mois-jour) qui correspond au nombre de jours écoulés depuis le 1970-01-01. ```r as_date(18954) ``` ``` ## [1] "2021-11-23" ``` --- ### _date-time_ : - Un point précis sur une ligne du temps qui correspond au nombre de secondes écoulées depuis le 1970-01-01 00:00:00 UTC. ```r as_datetime(1637691000) ``` ``` ## [1] "2021-11-23 18:10:00 UTC" ``` --- ## 1. Fonctions pour créer/transformer en format "date" et "temps" ### `as_date()`; `as_datetime` : ```r class(bixi$start_date) ``` ``` ## [1] "character" ``` ```r bixi_new$start_date <- as_date(bixi_new$start_date) ``` <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:200px; overflow-x: scroll; width:1080px; "><table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Nouvelle variable start_date</caption> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> start_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_start </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> end_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_end </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> duration_sec </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32.601 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39.080 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53.412 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39.598 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58.763 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40.679 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table></div> --- ### `as_date()`; `as_datetime` ...suite : ```r bixi_new$end_date <- as_datetime(bixi_new$end_date) ``` <table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Nouvelle variable end_date</caption> <thead> <tr> <th style="text-align:left;"> start_date </th> <th style="text-align:right;"> emplacement_pk_start </th> <th style="text-align:left;"> end_date </th> <th style="text-align:right;"> emplacement_pk_end </th> <th style="text-align:right;"> duration_sec </th> <th style="text-align:right;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table> ##### En _base r_ : > **as.Date** : bixi_new$start_date <- as.Date(bixi_new$start_date) > **as.POSIXct** : bixi_new$end_date <- as.POSIXct(bixi_new$end_date) --- ### `ymd()`; `mdy()`; `dmy()` et `_h()`; `_hm()`; `_hms()` : ```r mdy(date2) #"11-23-2021" ``` ``` ## [1] "2021-11-23" ``` ```r mdy(date3) #"11/23/2021" ``` ``` ## [1] "2021-11-23" ``` ```r mdy(date4) #"11232021" ``` ``` ## [1] "2021-11-23" ``` ```r dmy(date5) #"23-Nov-2021" ``` ``` ## [1] "2021-11-23" ``` ```r dmy_hms(date7) #"23-11-2021 16,30,50" ``` ``` ## [1] "2021-11-23 16:30:50 UTC" ``` --- ### Ces fonctions d'appliquent aussi à un _dataframe_ : ```r bixi_new <- bixi_new %>% dplyr::mutate(start_date = stringr::str_replace_all(start_date, "-", "/")) %>% dplyr::mutate(end_date = stringr::str_replace_all(end_date, "-", "/")) %>% dplyr::mutate(end_date = stringr::str_replace_all(end_date, ":", ",")) ``` <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:150px; overflow-x: scroll; width:1080px; "><table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Modification des variables start_date et end_date</caption> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> start_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_start </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> end_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_end </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> duration_sec </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021/10/17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021/10/17 06,37,32 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021/10/30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021/10/30 23,50,39 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021/10/10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021/10/10 18,10,53 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021/10/07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021/10/07 17,57,39 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021/10/28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021/10/28 16,19,58 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021/10/15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021/10/15 17,33,40 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table></div> ```r bixi_new$start_date <- ymd(bixi_new$start_date) bixi_new$end_date <- ymd_hms(bixi_new$end_date) ``` <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:150px; overflow-x: scroll; width:1080px; "><table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Application des fonctions ymd() et ymd_hms()</caption> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> start_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_start </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> end_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_end </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> duration_sec </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table></div> --- background-position: 470px 450px background-image: url("images/round_datetime_cheat_sheet.jpg") background-size: 300px ### `round_date`; `floor_date`; `ceiling_date` : ```r bixi_new$end_date <- round_date(bixi_new$end_date, unit = "seconds") ``` ##### En _base r_ : > **round.POSIXt** : bixi_new$end_date <- round.POSIXt(bixi_new$end_date, "secs") <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:120px; overflow-x: scroll; width:1080px; "><table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Application de la fonction round_date()</caption> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> start_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_start </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> end_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_end </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> duration_sec </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table></div> --- ## 2. Fonctions pour extraire des informations précises ### `year()`; `month()`; `day()`; `hour()`; `minute()`; `second()` : ```r bixi_new <- bixi_new %>% dplyr::mutate(day_end_date = day(end_date)) %>% dplyr::relocate(day_end_date, .after = "end_date") ``` <div style="border: 1px solid #ddd; padding: 0px; overflow-y: scroll; height:120px; overflow-x: scroll; width:1080px; "><table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Nouvelle variable day_end_date</caption> <thead> <tr> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> start_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_start </th> <th style="text-align:left;position: sticky; top:0; background-color: #FFFFFF;"> end_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> day_end_date </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> emplacement_pk_end </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> duration_sec </th> <th style="text-align:right;position: sticky; top:0; background-color: #FFFFFF;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32 </td> <td style="text-align:right;"> 17 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39 </td> <td style="text-align:right;"> 30 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39 </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58 </td> <td style="text-align:right;"> 28 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40 </td> <td style="text-align:right;"> 15 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table></div> ##### Une autre possibilité : > bixi_new$day_end_date <- format(bixi_new$end_date, format = "%d") <br> > bixi_new <- subset(bixi_new, select = c("start_date", "emplacement_pk_start", "end_date", "day_end_date", "emplacement_pk_end", "duration_sec", "is_member")) --- ### `yday()`; `wday()` : ```r bixi_new <- bixi_new %>% dplyr::mutate(yday = yday(end_date)) %>% dplyr::relocate(yday, .after = "day_end_date") ``` ```r bixi_new <- bixi_new %>% dplyr::mutate(wday_end_date = wday(end_date)) %>% dplyr::relocate(wday_end_date, .after = "day_end_date") ``` <table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Fonctions yday() et wday()</caption> <thead> <tr> <th style="text-align:left;"> start_date </th> <th style="text-align:right;"> emplacement_pk_start </th> <th style="text-align:left;"> end_date </th> <th style="text-align:right;"> day_end_date </th> <th style="text-align:right;"> wday_end_date </th> <th style="text-align:right;"> yday </th> <th style="text-align:right;"> emplacement_pk_end </th> <th style="text-align:right;"> duration_sec </th> <th style="text-align:right;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32 </td> <td style="text-align:right;"> 17 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 290 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39 </td> <td style="text-align:right;"> 30 </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 303 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1 </td> <td style="text-align:right;"> 283 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39 </td> <td style="text-align:right;"> 7 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 280 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58 </td> <td style="text-align:right;"> 28 </td> <td style="text-align:right;"> 5 </td> <td style="text-align:right;"> 301 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40 </td> <td style="text-align:right;"> 15 </td> <td style="text-align:right;"> 6 </td> <td style="text-align:right;"> 288 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table> --- ```r bixi_new <- bixi_new %>% dplyr::mutate(wday_end_date = wday(end_date, * label = TRUE, abbr = FALSE)) %>% dplyr::relocate(wday_end_date, .after = "day_end_date") ``` <table class="table" style="font-size: 12px; width: auto !important; margin-left: auto; margin-right: auto;"> <caption style="font-size: initial !important;">Fonction wday()</caption> <thead> <tr> <th style="text-align:left;"> start_date </th> <th style="text-align:right;"> emplacement_pk_start </th> <th style="text-align:left;"> end_date </th> <th style="text-align:right;"> day_end_date </th> <th style="text-align:left;"> wday_end_date </th> <th style="text-align:right;"> yday </th> <th style="text-align:right;"> emplacement_pk_end </th> <th style="text-align:right;"> duration_sec </th> <th style="text-align:right;"> is_member </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> 2021-10-17 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-17 06:37:32 </td> <td style="text-align:right;"> 17 </td> <td style="text-align:left;"> dimanche </td> <td style="text-align:right;"> 290 </td> <td style="text-align:right;"> 185 </td> <td style="text-align:right;"> 970 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-30 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-30 23:50:39 </td> <td style="text-align:right;"> 30 </td> <td style="text-align:left;"> samedi </td> <td style="text-align:right;"> 303 </td> <td style="text-align:right;"> 507 </td> <td style="text-align:right;"> 253 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-10 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-10 18:10:53 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> dimanche </td> <td style="text-align:right;"> 283 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 1381 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-07 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-07 17:57:39 </td> <td style="text-align:right;"> 7 </td> <td style="text-align:left;"> jeudi </td> <td style="text-align:right;"> 280 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:right;"> 1298 </td> <td style="text-align:right;"> 0 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-28 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-28 16:19:58 </td> <td style="text-align:right;"> 28 </td> <td style="text-align:left;"> jeudi </td> <td style="text-align:right;"> 301 </td> <td style="text-align:right;"> 780 </td> <td style="text-align:right;"> 2107 </td> <td style="text-align:right;"> 1 </td> </tr> <tr> <td style="text-align:left;"> 2021-10-15 </td> <td style="text-align:right;"> 10 </td> <td style="text-align:left;"> 2021-10-15 17:33:40 </td> <td style="text-align:right;"> 15 </td> <td style="text-align:left;"> vendredi </td> <td style="text-align:right;"> 288 </td> <td style="text-align:right;"> 1113 </td> <td style="text-align:right;"> 2517 </td> <td style="text-align:right;"> 1 </td> </tr> </tbody> </table> --- ## Trois catégories de temps _(timespans)_ -- ### Périodes : - Elles suivent le temps d'horloge _(clocktime)_, elles ignorent les irrégularités d'une ligne du temps (les changements d'heure, les années bissextiles, etc.). -- ### Durées : - Nombres de secondes entre deux mesures de temps, elles prennent en considération les irrégularités. -- ### Intervalles : - Période de temps précise entre deux instants (un début et une fin). --- background-image: url("images/timespans_cheat_sheet.png") background-position: 50% 50% ## Aide-mémoire provenant du [_cheat sheet_](https://evoldyn.gitlab.io/evomics-2018/ref-sheets/R_lubridate.pdf) --- ## 3. Calculs appliqués à des unités de temps .pull-left[ #### Création de variables : ```r maintenant <- now(tz = "America/New_York") remise <- ymd_hms("2021-12-23 6:59:00", tz = "America/New_York") temps_restant <- remise - maintenant temps_restant ``` ``` ## Time difference of 29.70885 days ``` ] .pull-right[ #### `as.period`; `as.duration`; `as.interval` : ```r as.period(temps_restant) ``` ``` ## [1] "29d 17H 0M 44.3843719959259S" ``` ```r as.duration(temps_restant) ``` ``` ## [1] "2566844.384372s (~4.24 weeks)" ``` ```r as.interval(maintenant, remise) ``` ``` ## [1] 2021-11-23 13:58:15 EST--2021-12-23 06:59:00 EST ``` ] --- ## Fonctions associées à `as.period`; `as.duration`; `as.interval` : #### Périodes : ```r remise + days(2) ``` ``` ## [1] "2021-12-25 06:59:00 EST" ``` > **Autres fonctions** : `years()`, `months()`, `weeks()`, `hours()`, `minutes()`, `seconds`, etc. #### Durées : ```r remise + ddays(2) ``` ``` ## [1] "2021-12-25 06:59:00 EST" ``` > **Autres fonctions** : `dyears()`, `dmonths()`, `dweeks()`, `dhours()`, `dminutes()`, `dseconds`, etc. --- #### Différence entre une période et une durée : ```r nouvelle_date <- ymd_hms("2022-03-12 12:00:00", tz = "America/New_York") ``` ```r nouvelle_date + days(1) #fontion liée à une période ``` ``` ## [1] "2022-03-13 12:00:00 EDT" ``` ```r nouvelle_date + ddays(1) #fonction liée à une durée ``` ``` ## [1] "2022-03-13 13:00:00 EDT" ``` #### Intervalles : ```r int_temps_restant <- maintenant %--% remise #crée un intervalle sans employer la fonction interval() int_flip(int_temps_restant) ``` ``` ## [1] 2021-12-23 06:59:00 EST--2021-11-23 13:58:15 EST ``` > `int_start()`, `int_end()`, `int_length()`, `int_diff()`, `int_aligns()`, etc. --- # 4. Les fuseaux horaires > #### **Rappel** : pour connaître votre fuseau horaire, vous pouvez utiliser la fonction `Sys.timezone()`. <br> La fonction `OlsonNames()` montre la liste complète des fuseaux horaires. #### Heures de Los Angeles 🎬, de New Delhi 🛕 et de Tokyo ⛩️ : ```r heure_los_angeles <- ymd_hms("2021-11-23 08:00:00", tz = "America/Los_Angeles") heure_new_delhi <- ymd_hms("2021-11-23 16:30:00", tz = "Asia/Kolkata") heure_tokyo <- ymd_hms("2021-11-23 23:00:00", tz = "Asia/Tokyo") ``` - Dans cet exemple, les heures de Los Angeles, de New Delhi et de Tokyo correspondent toutes à des heures variées dans le fuseau horaire de Montréal. --- ### `with_tz()` : - Cette fonction est utile lorsque l'on souhaite conserver le moment exact d'un autre fuseau horaire, mais que l'on veut le transformer dans le fuseau horaire de notre choix. #### Appliquée à un vecteur : ```r heures_originales <- c(heure_los_angeles, heure_new_delhi, heure_tokyo) ``` ```r heures_de_montreal <- with_tz(heures_originales, tzone = "America/New_York") ``` <table> <thead> <tr> <th style="text-align:left;"> </th> <th style="text-align:left;"> Date/heure_Mtl </th> </tr> </thead> <tbody> <tr> <td style="text-align:left;"> Los Angeles </td> <td style="text-align:left;"> 2021-11-23 11:00:00 </td> </tr> <tr> <td style="text-align:left;"> New Delhi </td> <td style="text-align:left;"> 2021-11-23 06:00:00 </td> </tr> <tr> <td style="text-align:left;"> Tokyo </td> <td style="text-align:left;"> 2021-11-23 09:00:00 </td> </tr> </tbody> </table> --- class: top, left # Ressources additionnelles : - [R for Data Science](https://r4ds.had.co.nz/dates-and-times.html) - [Cran.R Project `lubridate`](https://cran.r-project.org/web/packages/tidyverse/tidyverse.pdf) - [Cran.R Project `hms`](https://cran.r-project.org/web/packages/hms/hms.pdf) - [ds4psy](https://bookdown.org/hneth/ds4psy/10-3-time-lubridate.html) - [The Epidemiologist R Handbook](https://epirhandbook.com/en/working-with-dates.html) --- background-position: 50% 50% background-image: url("images/merci.gif") class: top, center #Merci de votre attention!