Gérer les dates et les heures avec le package lubridate

Si vous avez déjà dû travailler sur des fichiers comportant des données indiquant le temps, avec des dates, ou des heures (et des minutes et des secondes), ou les deux à la fois, vous savez que ce n’est pas toujours facile à gérer. D’abord, parce que les dates ne sont pas toujours écrites de la même façon. Par exemple, pour le premier mars 2019, on peut trouver “2019-03-01” ou encore 1-mars-2019, ou encore 01/03/2019, etc… La même remarque peut être faite pour les heures, les minutes et les secondes. Et ensuite, parce qu’il faut convertir ces données, qui sont généralement considérées comme des chaînes de caractères, ou des modalités d’une variable catégorielle à l’issue de l’importation dans R, dans un format (ou classe) reconnu comme étant du temps dans R. Ces formats (ou classes) sont notamment le format POSIXct et le format Date.

Une fois que ces données indiquant le temps, sont correctement reconnues par R, il est alors possible de les manipuler, de réaliser des analyses descriptives (par année, mois, jour, heure, etc…), de les représenter visuellement, ou encore de réaliser des calculs.

Le package lubridate a été spécialement conçu pour gérer ces données de temps et les rendre facilement manipulables. Cet article est alors une courte introduction à l’utilisation de ce package.

1.Le format standard des données de temps

Depuis 1988, il existe un format standardisé des données de date et d’heure. Ce format est régi par la norme ISO 8601. Cette norme spécifie que les dates doivent être exprimées selon le format YYYY-MM-DD (années-mois-jour) et que les heures doivent être exprimées selon le format HH:MM:SS (heures:minutes:secondes).

Ce sont ces formats qui sont utilisés par R. C’est donc vers ces formats qu’il faut transformer les données indiquant le temps.

 

2. Les données

Pour illustrer cet article, j’ai choisi d’utiliser le jeu de données “Pollution in Atchison Village, Richmond CA” disponible sur Kaggle.

Ce jeu de données contient des mesures de pollution et de vent réalisées entre août et novembre 2015, dans le Village d’Atchison, en Californie.

 

Comme vous pouvez le voir, le jeu de données comporte une variable Date qui contient à la fois des informations de dates et d’heures (et de minutes, mais pas de secondes). En utilisant la fonction tail(), on peut se rendre compte que les dates sont exprimées dans un format “mois/jour/année”. Les heures, quant à elles, sont exprimées dans un format “heure : minutes”.

 

L’étude de la structure de ces données par la fonction str(), nous permet de voir que cette variable “Date” est considérée comme une chaîne de caractères. Cela est dû au fait que l’argument “stringsAsFactors = FALSE” a été employé dans la fonction read.csv(). Sans cet argument, la variable “Date” serait considérée comme une variable catégorielle. Cela n’a pas d’influence pour la gestion des données indiquant le temps.

 

3.Changer le format et la classe

Le package lubridate contient plusieurs fonctions de parsing, qui prennent en entrée les données dans leur format original, et les transforment, d’une part dans le format standardisé, et d’autre part, dans une classe reconnue comme étant du temps, la fameuse classe POSIXct !

Ces fonctions sont nommées :

  • ymd_hms(), ymd_hm(), ymd_h()
  • ydm_hms(), ydm_hm(), ymd_h()
  • mdy_hms(), mdy_hm(), mdy_h()

y pour year, m pour month, d pour day, h pour hour, m pour minute et s pour second.

Il suffit de repérer l’ordre dans lequel sont exprimées les années, mois, jours puis heurs, minutes et secondes, puis d’utiliser la fonction correspondante pour transformer les données dans le format standardisé “YYYY-MM-DD HH:MM:SS”.

Par exemple, ici les données de temps sont exprimées en mois/jour/années puis heure : minute. Pour les transformer dans le format standardisé, il faut donc utiliser la fonction mdy_hm().

 

Les données de la variable Date2 sont bien dans le format standardisé, présenté précédemment.

Et si on regarde la structure, on peut voir que la variable Date2 est de classe POSIXct, alors que la variable Date est une chaîne de caractères.

 

Voici d’autres exemples de parsing :

 

Ces fonctions sont décrites dans la cheat sheet du package lubridate, téléchargeable ici.

 

Et si vous ne trouvez pas votre bonheur dans ces fonctions de parsing, vous pouvez spécifier précisément vos besoins en utilisant la fonction parse_date_time(). Pour plus de détails, consultez la page d’aide :

 

4. Ne Conserver que la Date

Parfois, on n’est pas du tout intéressé par la partie Heure. Dans cas, pour obtenir une variable contenant uniquement la date, j’utilise la fonction date() du package lubridate :

 

 

5. Séparer les composants de la date

Dans certaines situations,on peut avoir besoin d’étudier les données en fonction de certains éléments de la date, comme le mois, ou le jour par exemple. Pour cela, il est très utile de pouvoir créer une nouvelle variable “Month” par exemple, qui ne contiendra que le mois de la date considérée. Là encore le package lubridate permet de créer facilement ces variables grâce aux fonctions year(), month(), day(), hour(), minute(), second() etc..

Voici un exemple pour décomposer la variable Date en année, mois, jour, heure et minute :

 

Voici ce que ça donne:

 

Vous pourrez retrouver la liste complète des fonctions permettant de séparer les composantes d’une date sur la cheat sheet de lubridate .

 

6. Arrondir

Le package lubridate propose trois fonctions principales pour arrondir les dates, à l’unité désirée, qui peut être la seconde, la minute, l’heure, le jour, la semaine, le mois, les deux mois, le trimestre, la saison, la demi-année et l’année. Ces fonctions sont:

  • floor_date() : pour arrondir à l’unité inférieure,
  • ceiling_date(): pour arrondir à l’unité supérieure,
  • round_date() : pour arrondir à l’unité la plus proche.

Pour illustrer ces fonctions, je vais les appliquer successivement sur les trois dates suivantes, qui se situent de part et d’autre de 12h, et à 12h, le 1er août 2015, en utilisant une unité d’heure puis de jour.

 

 

7.Manipuler les données

La manipulation des données se fait très facilement avec les fonctions du package dplyr : Par exemple, pour créer un fichier ne comportant que les données se situant au-delà du 17 novembre 2015 :

 

Ou encore pour créer un sous fichier ne contenant que les données du mois de novembre :

 

Il est également est très facile de calculer des statistiques descriptives en employant notamment les fonctions group_by() et summarise_*() du package dplyr. Ici par exemple, les mesures de pollution et de vent sont moyennées pour chaque jour de chacun de mois :

 

8. Autres

Le package lubridate permet également de calculer des durées, des périodes et des intervalles et de gérer les time zones.

Par exemple, on peut calculer que 50 jours séparent le 10 janvier 2019, du premier mars 2019 :

 

Pour plus d’information, vous pouvez vous référer à la cheat sheet, ou encore au chapitre 16 du livre R for Data science d’Hadley Wickham.

 

9. Visualisation des données :

Une fois que les données sont converties en format de temps, le package ggplot2 permet de les visualiser facilement :

 

plot Date lubridate

 

plot date heure lubridate

Il est également possible de passer les données dans un format long , afin de réaliser, ensuite, un plot par variable, de façon automatisée, en employant la fonction facet_wrap.

 

 

plot date heure

En utilisant, les fonctions scale_x_datetime() (lorsque les données de temps comportent une date et une heure) et scale_x_date() (lorsque les données ne contiennent qu’une date), il est possible de modifier le format des étiquettes de la variable temps. Ces fonctions nécessitent de charger le package scales.

 

 

plot date heure avec R

Les options des formats de dates (les lettres %b, %Y, %W etc..) sont décrites dans la page d’aide de la fonction strptime()

 

Vous trouverez d’autres exemples, dans le livre R Graphics Cookbook de Winston Chang :

 

J’espère que cet article permettra aux débutants de mieux comprendre comment fonctionne la gestion des données de date et d’heure  sous R, et comment faire les premières manipulations .

Et si cet article vous a été utile, n’oubliez pas de le partager 😉

 

Poursuivez votre lecture

 

Crédit photo : geralt

Note : Je touche une petite commission (entre 3 et 6%) si vous passez par les liens Amazon de cet article pour acheter les livres mentionnés. cela m’aide à entretenir ce blog, merci si vous le faites ! 😉 
Partager l'article
  •  
  •  
  •  
  •  
  •  
    7
    Partages
  • 7
  •  
  •  
  •  
  •  

4 commentaires

  1. Dany OTRON Répondre

    Bonsoir Claire, Merci encore pour ces infos. Article très très informatif et instructif. J’ai bien aimé.

  2. Basso Répondre

    Bonjour Claire, merci pour cet article très utile qui répond à un problème auquel je suis confrontée!

  3. GUENZIZ Répondre

    Bonjour Claire

    Je vous souhaite une Meilleure années 2019

    Pleine de Santé et
    Plein de Succès

    Chaque jour je verifie si j’ai quelque chose de nouveau
    émanant de vous.
    C’est très interessant.

    Aziz

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *