9  Manipuler les dates

Travailler avec des dates dans R demande plus d’attention que de travailler avec d’autres classes d’objets. Nous vous proposons ci-dessous quelques outils et exemples pour rendre ce processus moins pénible. Heureusement, les dates peuvent étre facilement manipulées avec de la pratique et avec un ensemble de paquets utiles tels que lubridate.

Lors de l’importation de données brutes, R interpréte souvent les dates comme des objets de type caractère, ce qui signifie qu’elles ne peuvent pas être utilisêes pour des opérations générales sur les dates, comme la création de séries chronologiques et le calcul des intervalles de temps. Pour compliquer encore les choses, il existe de nombreuses façons de formater une date et vous devez aider R à savoir quelle partie d’une date représente quoi (mois, jour, heure, etc.).

Les dates dans R sont leur propre classe d’objet - la classe Date. Il est à noter qu’il existe également une classe qui stocke les objets de date et d’heure. Les objets date-heure sont formellement appelés classes POSIXt, POSIXct, et/ou POSIXlt (la différence n’est pas importante). Ces objets sont appelés de maniére informelle des classes datetime.

9.1 étapes préliminaires

Importation des paquets

Ces lignes de code chargent les paquets nécessaires aux analyses. Dans ce guide, nous mettons l’accent sur p_load() de pacman, qui installe le paquet si nécessaire puis l’importe pour l’utiliser. Vous pouvez également charger les paquets installés avec library() de base R. Voir la page sur bases de R pour plus d’informations sur les paquets R.

# Vérifie si le paquet est installé, l'installe si nécessaire, et charge le paquet pour la session en cours.

pacman::p_load(
  lubridate,  # paquet général pour la manipulation et la conversion des dates 
  parsedate,   # a une fonction pour "deviner" les dates désordonnées
  aweek,      # une autre option pour convertir les dates en semaines, et les semaines en dates
  zoo,        # fonctions supplémentaires de date et d'heure
  here,       # gestion de fichiers
  tidyverse,  # gestion et visualisation des données  
  rio)        # import des fichiers

Importation des données

Nous importons le jeu de données des cas d’une épidémie d’Ebola simulée. Si vous souhaitez télécharger les données pour suivre le processus étape par étape, consultez les instructions de la page télécharger le manuel et les données. Pour ce script, nous supposons que le fichier se trouve dans le répertoire de travail de la session R. Aucun sous-dossier n’est donc spécifié dans ce chemin de fichier.

linelist <- import("linelist_cleaned.xlsx")

9.2 Date actuelle

Vous pouvez obtenir la date ou l’heure “système” actuelle de votre ordinateur en effectuant les opérations suivantes avec base R.

# obtenir la date du système - il s'agit d'une classe DATE
Sys.Date()
[1] "2024-06-19"
# obtenir l'heure du système - il s'agit d'une classe DATETIME
Sys.time()
[1] "2024-06-19 12:46:30 CEST"

Avec le paquet lubridate, la date et l’heure du système peuvent aussi être retournées avec today() et now(), respectivement. date() renvoie la date et l’heure actuelles avec les noms des jours de la semaine et du mois.

9.3 Convertir en Date

Après avoir importé un ensemble de données dans R, les valeurs des colonnes de date peuvent ressembler à “1989/12/30”, “05/06/2014” ou “13 Jan 2020”. Dans ces cas, R traite probablement encore ces valeurs comme des valeurs de caractères. Il faut dire à R que ces valeurs sont des dates… et quel est le format de la date (quelle partie est le jour, le mois, l’année, etc.).

Une fois informé, R convertit ces valeurs en classe Date. En arriére-plan de l’interface, R stockera les dates sous forme de nombres (le nombre de jours depuis sa date “d’origine”, le 1er janvier 1970). Vous n’utiliserez pas souvent le nombre de dates, mais cela permet à R de traiter les dates comme des variables continues. Cela permet également à R d’autoriser des opérations spéciales pour les objets Date, comme le calcul de la distance entre les dates.

Par défaut, les valeurs de la classe Date dans R sont affichées sous la forme YYYY-MM-DD. Plus tard dans cette section, nous verrons comment modifier l’affichage des valeurs de date.

Nous présentons ci-dessous deux approches pour convertir une colonne de valeurs de caractères en classe Date.

**__CONSEIL:_** Vous pouvez vérifier la classe actuelle d’une colonne avec la fonction R base class(), comme class(linelist$date_onset).

base R

as.Date() est la fonction standard de base R pour convertir un objet ou une colonne en classe Date (notez la majuscule de “D”).

L’utilisation de as.Date() nécessite que :

  • Vous spécifiez le format existant de la date brute en caractères ou la date d’origine si vous fournissez des dates en forme de nombres (voir la section sur les dates Excel).
  • Si vous l’utilisez sur une colonne de caractères, toutes les valeurs de date doivent avoir le même format exact (si ce n’est pas le cas, essayez parse_date() du paquet parsedate)

Processus d’utilisation de as.Date() :

Premiérement, vérifiez la classe de votre colonne avec class() de base R. Si vous n’étiez pas sûr de la classe ou sommes confus au sujet de la classe de vos données (par exemple, vous voyez “POSIXct”, etc.), il peut être plus facile de convertir d’abord la colonne en classe Character avec as.character(), et ensuite de la convertir en classe Date.

Deuxiémement, dans la fonction as.Date(), utilisez l’argument format = pour indiquer à R le format actuel de la chaîne de caractères de la date - quels caractères font référence au mois, au jour et à l’année, et comment ils sont séparés. Si vos valeurs sont déjà dans un des formats de date standard de R (“YYYY-MM-DD” ou “YYYY/MM/DD”) l’argument format = n’est pas nécessaire.

Pour format =, fournissez une chaîne de caractères (entre guillemets) qui représente le format de date actuel en utilisant les abréviations spéciales “strptime” ci-dessous. Par exemple, si les dates de vos caractères sont actuellement au format “DD/MM/YYYY”, comme “24/04/1968”, vous utiliserez format = "%d/%m/%Y" pour convertir les valeurs en dates. Il est nécessaire de mettre le format entre guillemets. Et n’oubliez pas les barres obliques ou les tirets!

# Convertir en classe de date
linelist <- linelist %>% 
  mutate(date_onset = as.Date(date_of_onset, format = "%d/%m/%Y"))

La plupart des abréviations de strptime sont listées ci-dessous. Vous pouvez voir la liste compléte en exécutant ?strptime.

%d = numéro du jour du mois (5, 17, 28, etc.)
%j = numéro du jour de l’année (Jour 001-366)
%a = Jour de la semaine abrégé (Lun, Mar, Mer, etc.)
%A = Jour de la semaine (Lundi, Mardi, etc.) %w = numéro du jour de la semaine (0-6, le dimanche est 0)
%u = numéro du jour de la semaine (1-7, le lundi est 1)
%W = numéro de semaine(00-53, le lundi est le début de la semaine)
%U = numéro de semaine (01-53, le dimanche est le début de la semaine)
%m = numéro du mois (e.g. 01, 02, 03, 04)
%b = Mois abrégé (jan, févr, etc.)
%B = Mois complet (janvier, février, etc.)
%y = année à 2 chiffres (par example 89)
%Y = année à 4 chiffres (par example 1989)
%h = heures (horloge de 24 heures)
%m = minutes
%s = secondes %z = décalage par rapport à GMT
%Z = Fuseau horaire (caractère)

CONSEIL: L’argument format = de la fonction as.Date() n’indique pas à R le format que vous voulez donner aux dates, mais plutôt comment identifier les parties de la date telles qu’elles sont avant que vous lanciez la commande.

CONSEIL: Assurez-vous que dans l’argument format = vous utilisez le séparateur de partie de date (par exemple /, -, ou espace) qui est présent dans vos dates.

Une fois que les valeurs sont dans la classe Date, R les affichera par défaut dans le format standard, qui est AAAA-MM-JJ.

lubridate

La conversion d’objets caractères en dates peut être plus facile en utilisant le paquet lubridate. lubridate est un paquet tidyverse créé pour rendre le travail avec les dates et les heures plus simple et plus cohérent que dans base R. Pour ces raisons, lubridate est souvent considéré comme le paquet de référence pour les dates et les heures, et il est recommandé de travailler avec des variables de date ou d’heure.

Le paquet lubridate fournit plusieurs fonctions d’aide différentes créées pour convertir les objets caractères en dates de maniére intuitive, et plus facile que de spécifier le format dans as.Date(). Ces fonctions sont spécifiques au format de date brut, mais permettent une variété de séparateurs et de synonymes pour les dates (par exemple 01 vs Jan vs Janvier) - les synonymes sont nommés d’après les abréviations des formats de date.

# installez/chargez lubridate
pacman::p_load(lubridate)

La fonction ymd() convertit de maniére flexible les valeurs de date fournies sous la forme année, mois, jour. Cette fonction fonctionne avec n’importe quel séparateur utilisé dans les variables.

# lire la date au format année-mois-jour
ymd("2020-10-11")
[1] "2020-10-11"
ymd("20201011")
[1] "2020-10-11"

La fonction mdy() convertit de maniére flexible les valeurs de date fournies sous la forme mois, jour, année.

# lire la date au format mois-jour-année
mdy("10/11/2020")
[1] "2020-10-11"
mdy("Oct 11 20")
[1] "2020-10-11"

La fonction dmy() convertit de maniére flexible les valeurs de date fournies sous la forme jour, mois, année.

# lire la date au format jour-mois-année
dmy("11 10 2020")
[1] "2020-10-11"
dmy("11 October 2020")
[1] "2020-10-11"

Si vous utilisez le piping, la conversion d’une colonne de caractères en dates avec lubridate pourrait ressembler à ceci :

linelist <- linelist %>%
  mutate(date_onset = lubridate::dmy(date_onset))

Une fois terminé, vous pouvez exécuter class() pour vérifier la classe de la colonne

#Vérifiez la classe de la colonne
class(linelist$date_onset)  

Une fois que les valeurs sont dans la classe Date, R les affichera par défaut dans le format standard, qui est AAAA-MM-JJ.

Notez que les fonctions ci-dessus fonctionnent mieux avec des années à 4 chiffres. Les années à 2 chiffres peuvent produire des résultats inattendus, car lubridate va deviner le siècle.

Pour convertir une année à 2 chiffres en une année à 4 chiffres (toutes dans le même siècle), vous pouvez convertir en caractères de classe, puis combiner les chiffres existants avec un préfixe en utilisant str_glue() du paquet stringr (voir la page Caractères et chaînes de caractères). Vous pouvez ensuite convertir la colonne en date.

two_digit_years <- c("15", "15", "16", "17")
str_glue("20{two_digit_years}")
2015
2015
2016
2017

Combine columns

Vous pouvez utiliser les fonctions lubridate make_date() et make_datetime() pour combiner plusieurs colonnes numériques en une seule colonne de date. Par exemple, si vous avez les colonnes numériques onset_day, onset_month, et onset_year dans le cadre de données linelist :

linelist <- linelist %>% 
  mutate(onset_date = make_date(year = onset_year, month = onset_month, day = onset_day))

9.4 Dates en Excel

En arriére-plan, la plupart des logiciels stockent les dates sous forme de nombres. R stocke les dates à partir du 1er janvier 1970. Ainsi, si vous exécutez as.numeric(as.Date("1970-01-01)) vous obtiendrez 0.

Microsoft Excel enregistre les dates à partir du 30 décembre 1899 (Windows) ou du 1er janvier 1904 (Mac), selon votre système d’exploitation. Consultez ce guide Microsoft pour plus d’informations.

Les dates d’Excel sont souvent importées dans R sous la forme de ces valeurs numériques plutôt que sous la forme de caractères. Si le jeu de données que vous avez importé d’Excel montre des dates sous forme de nombres ou de caractères comme “41369”… utilisez la fonction as.Date() (ou la fonction as_date() de lubridate) pour convertir, mais au lieu de fournir un “format” comme ci-dessus, fournissez la date d’origine Excel à l’argument origin = dans la fonction.

Cela ne fonctionnera pas si la date Excel est stockée dans R comme un type de caractère, donc assurez-vous que le nombre est de classe Numérique!

NOTE: Vous devez fournir la date d’origine dans le format de date par défaut de R (“YYYY-MM-DD”).

# Un exemple de fourniture de la "date d'origine" d'Excel lors de la conversion de dates numériques d'Excel.
data_cleaned <- data %>% 
  mutate(date_onset = as.numeric(date_onset)) %>%   # ensure class is numeric
  mutate(date_onset = as.Date(date_onset, origin = "1899-12-30")) # convert to date using Excel origin

9.5 Dates désordonnées

Vous pouvez utiliser la fonction parse_date() du paquet parsedate pour lire une colonne de date “désordonnée” qui contient des dates dans de nombreux formats différents et convertir les dates dans un format standard. Vous pouvez en savoir plus en ligne sur parse_date().

Par exemple, parse_date lira un vecteur des dates en caractères suivantes : “03 Jan 2018”, “07/03/1982”, et “08/20/85” et les convertira en classe Date sous la forme de : 2018-01-03, 1982-03-07, et 1985-08-20.

parsedate::parse_date(c("03 January 2018",
                        "07/03/1982",
                        "08/20/85"))
[1] "2018-01-03 UTC" "1982-07-03 UTC" "1985-08-20 UTC"
# Un exemple d'utilisation de parse_date() sur la colonne date_onset
linelist <- linelist %>%                 # le dataframe s'appelle linelist, à ne pas confondre avec le paquet "linelist"
  mutate(
    date_onset = parse_date(date_onset))

9.6 Travailler avec la classe date-heure

Comme nous l’avons déjà mentionné, R supporte également une classe datetime - une colonne qui contient des informations de date et d’heure. Comme pour la classe Date, il faut souvent convertir les objets caracter en objets datetime.

Convertir des dates avec des heures

Un objet datetime standard est formaté avec la date en premier, qui est suivie par une entrée de temps - par exemple 01 Jan 2020, 16:30. Comme pour les dates, il existe de nombreuses façons de formater cet objet. Il existe de nombreux niveaux de précision (heures, minutes, secondes) qui peuvent être fournis à un objet “datetime”.

Il existe des fonctions du paquet lubridate pour aider à convertir ces chaînes en objets datetime. Ces fonctions sont des extensions des fonctions d’aide de date, avec _h (seulement les heures fournies), _hm (heures et minutes fournies), ou _hms (heures, minutes et secondes fournies) ajoutées à la fin (par exemple, dmy_hms()). Ils peuvent être utilisês comme indiqué :

Convertir une date avec seulement des heures en objet datetime

ymd_h("2020-01-01 16hrs")
[1] "2020-01-01 16:00:00 UTC"
ymd_h("2020-01-01 4PM")
[1] "2020-01-01 16:00:00 UTC"

Converter une date avec des heures et des minutes en objet datetime.

dmy_hm("01 Janvier 2020 16:20")
Warning: All formats failed to parse. No formats found.
[1] NA

Converrtir une date avec des heures, des minutes et des secondes en un objet de type datetime.

mdy_hms("01 Janvier 2020, 16:20:40")
[1] "2020-01-20 16:20:40 UTC"

Vous pouvez fournir le fuseau horaire mais il est ignoré par la fonction. Allez à la section plus bas dans le chapitre pour en savoir plus sur les fuseaux horaires dans R.

mdy_hms("01 Janvier 2020, 16:20:40 PST")
[1] "2020-01-20 16:20:40 UTC"

Avec un dataframe chargé dans R, les colonnes d’heure et de date peuvent être combinées pour créer une colonne de date en utilisant la fonction str_glue() du paquet stringr et la fonction appropriée du paquet lubridate, selon le format de date et d’heure dans le dataframe. Voir la page caractères et chaînes de caractères pour plus de détails sur stringr.

Dans cet exemple, le dataframe linelist a une colonne au format “heures:minutes”. Pour la convertir en date, nous suivons quelques étapes :

  1. Vous créez une colonne de temps d’admission “propre” avec les valeurs manquantes remplies avec la médiane de la colonne. Nous faisons cela parce que lubridate ne fonctionne pas sur les valeurs manquantes. Combinez la nouvelle colonne avec la colonne date_hospitalisation, puis utilisez la fonction ymd_hm() pour convertir en objet datetime.
# packages
pacman::p_load(tidyverse, lubridate, stringr)

# time_admission est une colonne en heures:minutes
linelist <- linelist %>%
  
#si l'heure d'admission n'est pas donnée, attribuez l'heure d'admission médiane.

  mutate(
    time_admission_clean = ifelse(
      is.na(time_admission),         # si l'heure est manquante
      median(time_admission),          # assigner la médiane
      time_admission                   # si elle n'est pas manquante, la garder telle quelle
  ) %>%
  
    # Utilisez str_glue() pour combiner les colonnes de date et d'heure afin de créer une colonne de caractères.
    # puis utiliser ymd_hm() pour la convertir en classe datetime
  mutate(
    date_time_of_admission = str_glue("{date_hospitalisation} {time_admission_clean}") %>% 
      ymd_hm()
  )

Convertir uniquement les temps

Si vos données ne contiennent qu’un caractère temps (heures et minutes), vous pouvez les convertir et les manipuler comme des temps en utilisant la fonction strptime() de base R. Par exemple, pour obtenir la différence entre deux temps :

# temps comme objets de caractère
time1 <- "13:45" 
time2 <- "15:20"

# temps converties en une classe de datetime
time1_clean <- strptime(time1, format = "%H:%M")
time2_clean <- strptime(time2, format = "%H:%M")

# La différence est de classe "difftime" par défaut, ici convertie en heures numériques. 
as.numeric(time2_clean - time1_clean)   # différence en heures
[1] 1.583333

Notez cependant que si aucune valeur de date n’est fournie, la fonction suppose que la date est aujourd’hui. Pour combiner une chaîne de date et une chaîne d’heure, voyez comment utiliser stringr dans la section juste au-dessus. Pour en savoir plus sur strptime() ici.

Pour convertir des nombres à un chiffre en nombres à deux chiffres (par exemple, pour ajouter des zéros aux heures ou aux minutes afin d’obtenir deux chiffres), consultez la section “Longueur des caractères” de la page caractères et chaînes de caractères.

Extraction d’éléments du temps

Vous pouvez extraire des éléments du temps avec hour(), minute(), ou second() du paquet lubridate.

Voici un exemple d’extraction de l’heure, puis de classement par partie de la journée. Nous commençons par la colonne time_admission, qui est dans la classe Character au format “HH:MM”. D’abord, la fonction strptime() est utilisêe comme décrit ci-dessus pour convertir les caractères en classe datetime. Ensuite, l’heure est extraite avec hour(), retournant un nombre de 0-24. Enfin, une colonne time_period est crée en utilisant la logique de case_when() pour classer les lignes en Matin/Après-midi/Soir/Nuit en fonction de leur heure d’admission.

linelist <- linelist %>%
  mutate(hour_admit = hour(strptime(time_admission, format = "%H:%M"))) %>%
  mutate(time_period = case_when(
    hour_admit > 06 & hour_admit < 12 ~ "Matin",
    hour_admit >= 12 & hour_admit < 17 ~ "Après-midi",
    hour_admit >= 17 & hour_admit < 21 ~ "Soir",
    hour_admit >=21 | hour_admit <= 6 ~ "Nuit"))

Pour en savoir plus sur la fonction case_when(), consultez la page Nettoyage des données et des fonctions de base.

9.7 Travailler avec des dates

Le paquet lubridate peut également être utilisê pour une variété d’autres fonctions, telles que l’extraction d’aspects d’une date/heure, l’exécution d’arithmétique pour les dates, ou le calcul d’intervalles de dates.

Nous définissons ici une date à utiliser dans les exemples :

# créer un objet de la classe Date
example_date <- ymd("2020-03-01")

Extraire les composants de la date

Vous pouvez extraire des aspects communs commes le mois, le jour, le jour de la semaine :

month(example_date) # numéro du mois
[1] 3
day(example_date) # jour (numéro) du mois
[1] 1
wday(example_date) # numéro du jour de la semaine (1-7)
[1] 1

Vous pouvez également extraire les composants temporels d’un objet ou d’une colonne en classe datetime. Cela peut être utile si vous voulez visualiser la distribution des temps d’admission.

example_datetime <- ymd_hm("2020-03-01 14:45")

hour(example_datetime) # extraire l'heure
minute(example_datetime) # extrait la minute
second(example_datetime) # extrait les secondes

Il existe plusieurs options pour récupérer les semaines. Lisez la section sur les semaines épidémiologiques ci-dessous pour en savoir plus.

Notez que si vous cherchez à afficher une date d’une certaine maniére (par exemple “Jan 2020” ou “Jeudi 20 mars” ou “Semaine 20, 1977”), vous pouvez le faire assez facilement en utilisant les méthodes décrites dans la section sur l’affichage des dates.

Mathématiques de dates

Vous pouvez ajouter certains nombres de jours ou de semaines en utilisant leur fonction respective du paquet lubridate.

# ajouter 3 jours à cette date
example_date + days(3)
[1] "2020-03-04"
# ajoute 7 semaines et soustrait deux jours à cette date
example_date + weeks(7) - days(2)
[1] "2020-04-17"

Intervalles entre les dates

La différence entre les dates peut être calculée par :

  1. Assurez-vous que les deux dates sont de la classe Date
  2. Utilisez la soustraction pour obtenir la différence “difftime” entre les deux dates.
  3. Si nécessaire, convertissez le résultat en classe numérique pour effectuer les calculs mathématiques suivants.

Ci-dessous, l’intervalle entre deux dates est calculé et affiché. Vous pouvez trouver des intervalles en utilisant le symbole “moins” de la soustraction sur des valeurs de la classe Date. Notez que la classe de la valeur retournée est “difftime” comme affiché ci-dessous, et doit être convertie en classe numérique.

# trouver l'intervalle entre example_date et le 20 février 2020 
output <- example_date - ymd("2020-02-20")
output    # imprimer
Time difference of 10 days
class(output)
[1] "difftime"

Pour effectuer d’autres opérations sur un objet de classe “difftime”, convertissez-le en numérique avec la fonction as.numeric().

Tout ceci peut être rassemblé pour travailler avec des données - par exemple :

pacman::p_load(lubridate, tidyverse) # charger les paquets

linelist <- linelist %>% # conversion de la date d'apparition en caractères
  
  # convertir la date d'apparition de objets caractères en objets date en spécifiant le format dmy
  mutate(date_onset = dmy(date_onset),
         date_hospitalisation = dmy(date_hospitalisation)) %>%
  
  # filtre tous les cas dont la date d'apparition n'est pas en mars
  filter(month(date_onset) == 3) %>% # filtrer tous les cas sans apparition en mars
    
  # trouver la différence en jours entre l'apparition et l'hospitalisation pour tous les cas
  mutate(days_onset_to_hosp = date_hospitalisation - date_of_onset)

Dans le dataframe, si l’une des dates ci-dessus est manquante, l’opération échouera pour cette ligne. Il en résultera un NA au lieu d’une valeur numérique. Lorsque vous utilisez cette colonne pour des calculs, assurez-vous de mettre l’argument na.rm = à TRUE (vrai). Par exemple :

# Calculez le nombre médian de jours d'hospitalisation pour tous les cas pour lesquels des données sont disponibles.
median(linelist_delay$days_onset_to_hosp, na.rm = T)

9.8 Affichage des dates

Une fois que les dates ont la bonne classe, vous voudrez peut-être qu’elles s’affichent différemment, par exemple qu’elles s’affichent comme “Lundi 05 Janvier” au lieu de “2018-01-05”. Vous pouvez aussi vouloir ajuster l’affichage afin de regrouper ensuite les lignes en fonction des éléments de date affichés - par exemple pour regrouper par mois-année.

format()

Ajustez l’affichage de la date avec la fonction format() de base R. Cette fonction accepte une chaîne de caractères (entre guillemets) spécifiant le format final souhaité dans les abréviations “%” strptime (la même syntaxe que celle utilisêe dans la fonction as.Date()). Vous trouverez ci-dessous la plupart des abréviations courantes.

NOTE: l’’utilisation de format() convertira les valeurs dans la classe Character, donc cette fonction est généralement utilisêe vers la fin d’une analyse ou uniquement pour l’affichage ! Vous pouvez voir la liste complète en exécutant ?strptime.

%d = numéro du jour du mois (5, 17, 28, etc.)
%j = numéro du jour de l’année (Jday 001-366)
%a = Jour de la semaine abrégé (lun, mar, mer, etc.)
%A = Jour de la semaine complet (lundi, mardi, etc.)
%w = numéro du jour de la semaine (0-6, le dimanche est 0)
%u = numéro du jour de la semaine (1-7, le lundi est 1)
%W = numéro de la semaine (00-53, le lundi est le début de la semaine)
%U = numéro de la semaine (01-53, le dimanche est le début de la semaine)
%m = numéro du mois (par exemple 01, 02, 03, 04)
%b = Mois abrégé (Jan, Feb, etc.)
%B = Mois complet (janvier, février, etc.)
%y = année à 2 chiffres (ex. 89)
%Y = année à 4 chiffres (ex. 1989)
%h = heures (horloge de 24 heures)
%m = minutes
%s = secondes
%z = décalage par rapport à GMT
%Z = Fuseau horaire (caractère)

Un exemple de formatage de la date du jour:

# date du jour, avec formatage
format(Sys.Date(), format = "%d %B %Y")
[1] "19 June 2024"
# moyen simple d'obtenir la date et l'heure complètes (formatage par défaut)
date()
[1] "Wed Jun 19 12:46:32 2024"
# formatage de la date, de l'heure et du fuseau horaire combinés ensemble avec la fonction str_glue()
str_glue("{format(Sys.Date(), format = '%A, %B %d %Y, %z %Z, ')}{format(Sys.time(), format = '%H:%M:%S')}")
Wednesday, June 19 2024, +0000 UTC, 12:46:32
#Utilisation du formatage pour afficher les semaines
format(Sys.Date(), "%Y Week %W")
[1] "2024 Week 25"

Notez que si vous utilisez la fonction str_glue(), sachez qu’à l’intérieur des guillemets doubles ” vous ne devez utiliser que des guillemets simples (comme ci-dessus).

Mois-année

Pour convertir une colonne de date au format mois-année, nous vous suggérons d’utiliser la fonction as.yearmon() du paquet zoo. Cette fonction convertit la date en classe “yearmon” et conserve l’ordre correct. En revanche, l’utilisation de la fonction format(colonne, "%Y %B") convertira la date en classe caractère et classera les valeurs par ordre alphabétique (de maniére incorrecte).

Ci-dessous, une nouvelle colonne yearmonth est créée à partir de la colonne date_onset, en utilisant la fonction as.yearmon(). L’ordre par défaut (correct) des valeurs résultantes est indiqué dans le tableau.

# créer une nouvelle colonne 
test_zoo <- linelist %>% 
     mutate(yearmonth = zoo::as.yearmon(date_onset))

# imprimer le tableau
table(test_zoo$yearmon)

Apr 2014 May 2014 Jun 2014 Jul 2014 Aug 2014 Sep 2014 Oct 2014 Nov 2014 
       7       64      100      226      528     1070     1112      763 
Dec 2014 Jan 2015 Feb 2015 Mar 2015 Apr 2015 
     562      431      306      277      186 

En revanche, vous pouvez voir comment la seule utilisation de format() permet d’obtenir le format d’affichage souhaité, mais pas l’ordre correct.

# créer une nouvelle colonne
test_format <- linelist %>% 
     mutate(yearmonth = format(date_onset, "%b %Y"))

# imprimer le tableau
table(test_format$yearmon)

Apr 2014 Apr 2015 Aug 2014 Dec 2014 Feb 2015 Jan 2015 Jul 2014 Jun 2014 
       7      186      528      562      306      431      226      100 
Mar 2015 May 2014 Nov 2014 Oct 2014 Sep 2014 
     277       64      763     1112     1070 

Note : si vous travaillez dans un ggplot() et vous voulez ajuster la façon dont les dates sont affichées uniquement, il peut être suffisant de fournir un format strptime à l’argument date_labels = dans scale_x_date() - vous pouvez utiliser "%b %Y" ou "%Y %b". Consultez la page Astuces de ggplot pour une explication plus approfondie.

Alternativement, le paquet zoo posséde la fonction as.yearqtr(), et vous pouvez utiliser scale_x_yearmon() lorsque vous utilisez ggplot() pour ajuster la façon dont les dates sont affichées sur le graphique.

9.9 Semaines épidémiologiques

lubridate

Consultez la page Regroupement de données pour des exemples plus complets de regroupement de données par date. Ci-dessous, nous décrivons briévement le regroupement des données par semaine.

Nous recommandons généralement d’utiliser la fonction floor_date() du package lubridate, avec l’argument unit = "week". Cela arrondit la date au “début” de la semaine, comme défini par l’argument week_start =. Le début de semaine par défaut est 1 (pour les lundis) mais vous pouvez spécifier n’importe quel jour de la semaine comme début (par exemple 7 pour les dimanches). floor_date() est polyvalent et peut être utilisê pour arrondir à d’autres unités de temps en définissant unit = à “seconde”, “minute”, “heure”, “jour”, “mois” ou “année”.

La valeur retournée est la date de début de la semaine, dans la classe Date. La classe Date est utile pour tracer les données, car elle est ordonnée correctement et elle sera facilement reconnue par ggplot().

Si vous êtes seulement intéressé par l’ajustement des dates pour afficher par semaine dans un graphique, voyez la section de ce chapitre sur l’affichage des dates. Par exemple, lorsque vous tracez une épicurve, vous pouvez formater l’affichage de la date en fournissant la nomenclature strptime “%” désirée. Par exemple, utilisez “%Y-%W” ou “%Y-%U” pour spécifier l’année et le numéro de semaine (respectivement le lundi ou le dimanche en début de semaine).

Comptages hebdomadaires

Allez à la page Regroupement des données pour une explication détaillée du regroupement des données avec count(), group_by(), et summarise(). Voici un bref exemple.

  1. créez une nouvelle colonne ‘semaine’ avec mutate(), en utilisant floor_date() avec unit = "week".
  2. Obtenez le nombre de lignes (cas) par semaine avec count() ; filtrez les cas dont la date est manquante.
  3. Terminez avec complete() du paquet tidyr pour vous assurer que toutes les semaines apparaissent dans les données - même celles qui n’ont pas de lignes/cas. Par défaut, les valeurs de comptage pour toutes les “nouvelles” lignes sont NA, mais vous pouvez les rendre 0 avec l’argument fill =, qui attend une liste nommée (ci-dessous, n est le nom de la colonne de comptage).
# créez un jeu de données agrégé des comptes hebdomadaires de cas.
weekly_counts <- linelist %>% 
  drop_na(date_onset) %>%             # Suppression des cas pour lesquels il manque la date de début de la maladie
  mutate(weekly_cases = floor_date(   # créer une nouvelle colonne, semaine d'apparition du cas
    date_onset,
    unit = "week")) %>%            
  count(weekly_cases) %>%           # grouper les données par semaine et compter les lignes par groupe (crée la colonne 'n')
  tidyr::complete(                  # Assurez-vous que toutes les semaines sont présentes, même celles où aucun cas n'a été observé.
    weekly_cases = seq.Date(          # definir la colonne "weekly_cases" comme une séquence complète
      from = min(weekly_cases),       # à partir de la date minimum
      to = max(weekly_cases),         # jusqu'à la date maximale
      by = "week"),                   # agrégé par semaines
    fill = list(n = 0))             # Remplir les NA dans la colonne des comptes n avec 0

Voici les premiéres lignes du jeu de données résultant :

différentes méthodes pour les epiweeks

Notez que le paquet lubridate posséde des fonctions alternatives week(), epiweek(), et isoweek(), dont chacune a des dates de début légérement différentes et d’autres nuances. De maniére générale, floor_date() devrait suffire à vos besoins. Pour en savoir plus sur ces fonctions, entrez ?week dans la console ou lisez la documentation ici.

Vous pouvez également utiliser le paquet aweek pour définir les semaines épidémiologiques. Vous pouvez en savoir plus sur le paquet aweek sur le site de RECON. aweek contient les fonctions date2week() et week2date() dans lesquelles vous pouvez définir le jour de début de semaine avec week_start = "Monday". aweek est le plus simple si vous voulez spécifier vos dates sous forme de numéro de semaine (par exemple “2020-W12”). Un autre avantage du package aweek est que lorsque date2week() est appliqué à une colonne de date, la colonne retournée (format de semaine) est automatiquement de la classe Factor et inclut les niveaux de toutes les semaines de l’intervalle de temps (cela évite l’étape supplémentaire de complete() décrite ci-dessus). Cependant, aweek n’a pas la fonctionnalité d’arrondir les dates à d’autres unités de temps comme les mois, les années, etc.

Une autre alternative pour les séries temporelles qui fonctionne également bien pour afficher un format “semaine” (“2020 W12”) est yearweek() du paquet tsibble, comme démontré dans la page sur Série temporelle et détection des épidémies.

9.10 Conversion des dates/fuseaux horaires

Lorsque des données sont présentes dans différents fuseaux horaires, il peut souvent être important de standardiser ces données dans un fuseau horaire unifié. Cela peut présenter un défi supplémentaire, car la l’élément fuseau horaire des données doit être codée manuellement dans la plupart des cas.

Dans R, chaque objet datetime posséde un élément fuseau horaire. Par défaut, tous les objets datetime portent le fuseau horaire local de l’ordinateur utilisê - ce fuseau est généralement spécifique à une localisation plutôt qu’à un fuseau horaire nommé, car les fuseaux horaires changent souvent en fonction de l’heure d’été. Il n’est pas possible de compenser avec précision les fuseaux horaires sans la composante temporelle d’une date, car l’événement que représente une colonne de date ne peut être attribué à une heure spécifique, et les décalages horaires mesurés en heures ne peuvent donc pas être raisonnablement pris en compte.

Pour définir des fuseaux horaires différents, il existe un certain nombre de fonctions dans le paquet lubridate qui peuvent être utilisêes pour changer le fuseau horaire d’un objet datetime du fuseau horaire local à un fuseau horaire différent. Les fuseaux horaires sont définis en attribuant un fuseau horaire valide de la base de données tz à l’objet datetime. Une liste de ces fuseaux est disponible ici - si le lieu dont vous utilisez les données ne figure pas sur cette liste, les grandes villes voisines dans le fuseau horaire sont disponibles et servent le même objectif.

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

# Assignez l'heure actuelle à une colonne 
time_now <- Sys.time()
time_now
[1] "2024-06-19 12:46:33 CEST"
# utilisez with_tz() pour affecter un nouveau fuseau horaire à la colonne, tout en CHANGEANT l'heure de l'horloge
time_london_real <- with_tz(time_now, "Europe/London")

# Utilisez force_tz() pour assigner un nouveau fuseau horaire à la colonne, tout en conservant l'heure de l'horloge.
time_london_local <- force_tz(time_now, "Europe/London")


# notez que tant que l'ordinateur qui a été utilisê pour exécuter ce code n'est PAS réglé sur l'heure de Londres,
# il y aura une différence dans les heures 
# (le nombre d'heures de différence entre le fuseau horaire de l'ordinateur et l'heure de Londres)
time_london_real - time_london_local
Time difference of -1 hours

Cela peut sembler largement abstrait, et n’est souvent pas nécessaire si l’utilisateur ne travaille pas sur plusieurs fuseaux horaires.

9.11 Calculs de décalage et d’avance

lead() et lag() sont des fonctions du paquet dplyr qui aident à trouver les valeurs précédentes (décalées) ou suivantes (en avance) dans un vecteur - généralement pour un vecteur numérique ou de date. Ces fonctions sont utiles pour calculer les changements/différences entre les unités de temps.

Supposons que vous vouliez calculer la différence de cas entre la semaine en cours et la semaine précédente. Les données sont initialement fournies en nombre de cas hebdomadaires, comme indiqué ci-dessous.

Lorsque vous utilisez lag() ou lead(), l’ordre des lignes dans le dataframe est très important ! - Faites attention à ce que vos dates/chiffres soient ascendants ou descendants.

La premiére étape consiste à créer une nouvelle colonne contenant la valeur de la semaine précédente (décalée).

  • Contrôlez le nombre d’unités en arriére/en avant avec n = (doit être un integer non-négatif)
  • Utilisez default = pour définir la valeur placée dans les lignes inexistantes (par exemple, la premiére ligne pour laquelle il n’y a pas de valeur décalée). Par défaut, c’est NA.
  • Utilisez order_by = TRUE si vos lignes ne sont pas ordonnées par votre colonne de référence.
counts <- counts %>% 
  mutate(cases_prev_wk = lag(cases_wk, n = 1))

L’étape suivante consiste à créer une nouvelle colonne qui est la différence entre les deux colonnes de cas :

counts <- counts %>% 
  mutate(cases_prev_wk = lag(cases_wk, n = 1),
         case_diff = cases_wk - cases_prev_wk)

Vous pouvez en savoir plus sur lead() et lag() dans la documentation ici ou en entrant ?lag dans votre console.

9.12 Ressources

lubridate tidyverse page
lubridate RStudio cheatsheet
R for Data Science page on dates and times
Online tutorial Date formats