Gérer et manipuler des dates en 2024 : une année pas comme les autres !

Auteur : Arthur Bréant
Tags : Autour de R
Date :

Bien qu’elle ne soit pas encore terminée, 2024 est une année qui restera dans les esprits. En effet, elle a été marquée par de nombreux événements que nous conserverons, plus ou moins, en mémoire.

Parmi ces événements, on peut citer :

  • le 80ème anniversaire du Débarquement en Normandie,

  • une tentative d’assassinat de Donald Trump,

  • les Jeux Olympiques de Paris,

  • les élections présidentielles aux Etats-Unis,

  • la suite des conflits un peu partout dans le monde,

  • le 50ème anniversaire du Rubik’s Cube.

Et bien d’autres encore …

Cette année 2024 est également une année “spéciale” car il s’agit d’une année bissextile. Cela signifie qu’elle comporte 366 jours au lieu de 365.

En revanche, en 2024, nous continuons de recommander l’utilisation du package {lubridate} pour gérer et manipuler les dates. Ce package est très pratique et permet de réaliser de nombreuses opérations sur les dates.

Exemple d’utilisation du package {lubridate}

Notre précédent article introductif sur le package {lubridate} est toujours d’actualité et nous vous recommandons de le lire si vous ne l’avez pas encore fait : À la bonne heure”… avec R.

Pour rappel, voici quelques exemples d’utilisation du package {lubridate} :

Dans un premier temps, chargeons le package :

library(lubridate)
# Création d'une date
date <- ymd("2024-07-14")
date
## [1] "2024-07-14"

Nous obtenons ici une date au format Date et compatible au format ISO 8601.

Pour rappel, la norme ISO 8601 définit un format standard pour représenter les dates et les heures, facilitant l’échange de données à l’international. Elle place, notamment, la plus grande unité de temps à gauche, donc l’ordre est : année, mois, jour pour les dates (AAAA-MM-JJ) et heures, minutes, secondes pour les heures.

Continuons avec quelques manipulations possibles à partir de cette date.

  • Extraire le jour de la semaine :
wday(date, label = TRUE, abbr = FALSE)
## [1] Sunday
## Levels: Sunday < Monday < Tuesday < Wednesday < Thursday < Friday < Saturday
  • Extraire le mois
month(date, label = TRUE, abbr = FALSE)
## [1] July
## Levels: January < February < March < April < May < June < July < August < September < October < November < December
  • Arrondir la date à la semaine la plus proche
floor_date(date, unit = "week", week_start = 1)
## [1] "2024-07-08"

Nous obtenons ici la date du lundi de la semaine la plus proche.

Davantage d’exemples sont disponibles dans le précédent article et également sur le site du package lubridate.

2024, les particularités …

Une année bissextile

{lubridate} permet également d’ajouter ou de soustraire des jours, des mois, des années, etc. à une date donnée.

Par exemple, pour ajouter 3 jours à la date date :

date + days(3)
## [1] "2024-07-17"

C’est parfait, nous venons d’ajouter 3 jours à la date date.

Mais nous l’avons dit, l’année 2024 est une année bissextile. Cela signifie qu’elle comporte 366 jours au lieu de 365.

D’ailleurs, pour vérifier si une année est bissextile, on peut utiliser la fonctionleap_year() du package{lubridate}.

leap_year(2024)
## [1] TRUE
leap_year(2025)
## [1] FALSE

Que se passe-t-il si nous modifions notre date afin qu’elle corresponde au 29 février 2024 et que nous ajoutons 1 an ?

date <- ymd("2024-02-29")
date + years(1)
## [1] NA

Nous obtenons ici un NA car le 29 février 2025 n’existe pas.

Comment gérer cette situation ?

Utiliser la fonction dyears()

La fonction dyears permet de créer une notion de durée en secondes. Elle correspond à environ 31557600 secondes. Tandis que la fonction years possède une notion de durée en année(s).

date + dyears(1)
## [1] "2025-02-28 06:00:00 UTC"

Nous obtenons ici la date du 28 février 2025.

Cependant, cette solution n’est pas parfaite car il s’agit d’une approximation.

Si nous réalisons la même opération avec la date du 28 février 2024, nous obtenons le 27 février 2025 :

ymd("2024-02-28") + dyears(1)
## [1] "2025-02-27 06:00:00 UTC"

Utiliser la fonction add_with_rollback()

La fonction add_with_rollback permet de gérer les dates de manière plus précise. Cette fonction ajuste une date en ajoutant une durée (comme des mois ou des années), tout en gérant automatiquement les situations où la nouvelle date n’existe pas, par exemple en revenant au dernier jour du mois si le jour calculé dépasse la fin du mois.

add_with_rollback(ymd("2024-02-29"), years(1))
## [1] "2025-02-28"

Ici, la fonction add_with_rollback nous renvoie la date du 28 février 2025, au format date. C’est parfait !

Que se passe-t-il si je souhaite ajouter 4 ans et tomber sur la prochaine année bissextile ?

add_with_rollback(ymd("2024-02-29"), years(4))
## [1] "2028-02-29"

Nous obtenons ici la date du 29 février 2028.

Une année à 53 semaines

En 2024, l’année comporte 53 semaines. Cela signifie que la dernière semaine de l’année est une semaine 53.

Cela peut générer des problèmes si vous utilisez la fonction week() du package {lubridate} pour extraire le numéro de la semaine.

Imaginons un petit cas pratique. Nous sommes propriétaire d’une petite boutique de café (car le café c’est la vie) et nous souhaitons connaître nos ventes par semaine.

Chargeons les packages nécessaires :

library(dplyr)
library(ggplot2)
library(glue)

Nous allons créer un jeu de données fictif pour illustrer notre exemple :

data <- tibble(
  date = seq(ymd("2024-12-25"), ymd("2025-02-02"), by = "day"),
  ventes_cafe = sample(100:500, 40, replace = TRUE)
)
data %>%
  mutate(
    week = glue("Semaine {week(date)}")
  )
## # A tibble: 40 × 3
##    date       ventes_cafe week      
##    <date>           <int> <glue>    
##  1 2024-12-25         246 Semaine 52
##  2 2024-12-26         472 Semaine 52
##  3 2024-12-27         110 Semaine 52
##  4 2024-12-28         380 Semaine 52
##  5 2024-12-29         259 Semaine 52
##  6 2024-12-30         311 Semaine 53
##  7 2024-12-31         321 Semaine 53
##  8 2025-01-01         442 Semaine 1 
##  9 2025-01-02         183 Semaine 1 
## 10 2025-01-03         475 Semaine 1 
## # ℹ 30 more rows

Les dates du 30 et 31 décembre 2024 sont considérées comme faisant partie de la semaine 53. Or selon la norme ISO 8601, ces dates font partie de la semaine 1 de l’année 2025.

Pour corriger cela, nous allons utiliser la fonction isoweek() du package {lubridate}.

week(ymd("2024-12-31"))
## [1] 53
isoweek(ymd("2024-12-31"))
## [1] 1

Et l’appliquer sur notre tableau :

data %>%
  mutate(
    week = glue("Semaine {isoweek(date)}")
  )
## # A tibble: 40 × 3
##    date       ventes_cafe week      
##    <date>           <int> <glue>    
##  1 2024-12-25         246 Semaine 52
##  2 2024-12-26         472 Semaine 52
##  3 2024-12-27         110 Semaine 52
##  4 2024-12-28         380 Semaine 52
##  5 2024-12-29         259 Semaine 52
##  6 2024-12-30         311 Semaine 1 
##  7 2024-12-31         321 Semaine 1 
##  8 2025-01-01         442 Semaine 1 
##  9 2025-01-02         183 Semaine 1 
## 10 2025-01-03         475 Semaine 1 
## # ℹ 30 more rows

Nous obtenons ici les bonnes semaines composées de 7 jours chacune selon la norme ISO 8601.

Finalisons notre exemple en calculant les ventes par semaine :

data %>%
  mutate(
    week = glue("Semaine {isoweek(date)}")
  ) %>%
  group_by(week) %>%
  summarise(
    ventes = sum(ventes_cafe)
  ) |>
  ggplot(
    aes(
      x = factor(
        x = week,
        levels = c(
          "Semaine 52", "Semaine 1", "Semaine 2", "Semaine 3", "Semaine 4", "Semaine 5"
        )
      ),
      y = ventes
    )
  ) +
  geom_col(
    fill = "#f05622"
  ) +
  theme_minimal() +
  labs(
    title = "Ventes de café par semaine entre fin 2024 et début 2025",
    x = "Semaine",
    y = "Ventes"
  )

à noter : la fonction isoyear existe également.

isoyear("2024-12-31")
## [1] 2025

Conclusion

La manipulation des dates est une tâche courante en analyse de données. Cette tâche peut vite devenir fastidieuse si elle n’est pas bien maîtrisée.

L’année 2024, avec ses particularités, nous offre l’occasion de tester et de perfectionner nos compétences en manipulation de dates.

Si vous souhaitez vous perfectionner encore davantage, n’hésitez pas à consulter nos formations sur le sujet, sur la manipulation des données, dont les dates ou sur la création de visualisations

En attendant, c’est l’heure de prendre un café !


Commentaires


À lire également

Nos formations Certifiantes à R sont finançables à 100% via le CPF

Nos formations disponibles via moncompteformation.gouv.fr permettent de délivrer des Certificats reconnues par l’état, enregistrées au répertoire spécifique de France Compétences. 3 niveaux de certifications existent :

Contactez-nous pour en savoir plus.

Calendrier

10/12/2024

05/11/2024

05/11/2024