Formats variés de Dates : corrigez les en un clin d’oeil avec datefixR

Introduction

Analyser des données qui contiennent des dates est toujours un peu compliqué, parce qu’il existe de nombreux formats différents pour écrire des dates :

  • l’ordre du jour, du mois ou de l’année peut varier,

  • différents séparateurs (“-”, “/”, ou un espace) peuvent être utilisés,

  • les mois peuvent être numériques, en lettres, ou en abréviations,

  • et l’année peut être indiquée avec deux ou quatre chiffres.

Voici quelques exemples de format de dates que l’on peut rencontrer :

library(datefixR)
exampledates
  id              some.dates some.more.dates
1  1                02 05 92            2015
2  2              01-04-2020        02/05/00
3  3              1996/05/01         05/1990
4  4             2020-may-01         2012-08
5  5                02-04-96        jan 2020
6  6          le 3 mars 2013      22.07.1977
7  7 7 de septiembre de 2014           13821 

Lorsque le format est homogène sur toute une variable (colonne d’un data frame), la conversion vers le format standardisé YYYY-MM-DD peut se faire assez facilement avec les fonctions de parsing du package lubridate.

Pour plus d’informations sur le package lubridate, vous pouvez consulter mon article “Gérer les données de date et d’heure avec le package lubridate“.

Mais lorsque différents formats sont présents à l’intérieur d’une même colonne (c’est une situation qui arrive fréquemment lorsqu’un dataset est créé par différentes personnes successivement), cela est beaucoup plus difficile !😱

Uniformiser les formats variés de date

Et c’est là que le package DateFixR apporte une solution quasi miraculeuse 🤩! Sa fonction fix_date_df() permet de convertir tous ces différents formats de date au sein d’une même colonne, en format standardisé YYYY - MM - DD et en classe date (classe comprise par R comme étant une date).

Et Si datefixR ne parvient pas standardiser une date, par exemple parce qu’elle est trop mal formée, cette date est précisé edans la console, ainsi que son numéro de ligne dans le data frame.

Cette fonction fix_date_df() est simple à employer, elle prend en entrée 2 arguments principaux:

  • les data , ici c’est le data frame exempledates``(il est inclus dans le packagedatefixeR`)
  • les noms des variables de date à corriger, sous la forme d’un vecteur (ici “some.dates”, “some.more.dates” )
fixed.df <- fix_date_df(exampledates, 
                        c("some.dates", "some.more.dates"))
fixed.df

  id some.dates some.more.dates
1  1 1992-05-02      2015-07-01
2  2 2020-04-01      2000-05-02
3  3 1996-05-01      1990-05-01
4  4 2020-05-01      2012-08-01
5  5 1996-04-02      2020-01-01
6  6 2013-03-03      1977-07-22
7  7 2014-09-07      2007-11-04 

C’est vraiment miraculeux, non ?

Les langues actuellement prises en charge sont !

  • Anglais 
  • Français (coup de chance !😍)
  • Allemand
  • Espagnol
  • Russe

Réparer les formats variés de date avec une interface

En plus de cette fonction trop chouette, les développeurs ont créé une application shiny avec laquelle vous pouvez :

  • importer vos données en .csv américain (séparateur de colonne par virgule et décimale par point), ou .xlsx (Cliquez sur le bouton Refresh pour faire apparaitre le dataset))
  • sélectionner les variables de date à corriger
  • exporter le fichier corrigé (bouton Download)

Pour lancer l’application, utilisez la commande suivante, dans la console R :

fix_date_app() 
Application shiny pour uniformiser des formats variés de date

Les fonctions spécifique de nettoyage des dates

Convertir une chaine de caractères en date

Le package datefixR() contient aussi a fonction fix_date_char() qui permet spécifiquement de convertir une chaîne de caractères de dates mal formatée, en classe date :

fix_date_char("7 septembre 2014") # en français

[1] "2014-09-07"
fix_date_char("7 de septiembre del 2014") # en espagnol

[1] "2014-09-07" 

Il est également possible de préciser l’ordre mois/jour, avec l’argument format :

fix_date_char("01 02 2014", format = "mdy")

[1] "2014-01-02"
fix_date_char("01 02 2014", format = "dmy")

[1] "2014-02-01" 

Lorsque le jour du mois n’a pas été fourni, le premier jour du mois est imputé par défaut : 

fix_date_char("1992", day.impute = 1, month.impute = 1)

[1] "1992-01-01"
fix_date_char("1992", day.impute = 1, month.impute = 3)

[1] "1992-03-01" 

Convertir une date numérique en date

En utilisant l’argument excel = TRUE, la fonction fix_date_char() permet de corriger une date ayant été convertie en date numérique dans Excel (cad exprimé en nombre de jours depuis le 1er janvier 1900) :

fix_date_char("44941", excel = TRUE)

[1] "2023-01-15" 

NB : la fonction excel_numeric_to_date() du package janitor permet également de faire cette correction (voir l’article “nettoyer les données sous R : 7 situations courantes“.

Conclusion

Lorsqu’elles sont incohérentes ou mal formatées, la gestion des dates, dans un jeu de données, peut être un vrai défi. Le package DateFixR est alors un outil précieux puisqu’il nous permet de de convertir une grande variété de formats de dates en un format standard et dans une classe de date compatible avec R, et cela avec une seule fonction ! De plus, le fait que datefixR prenne en charge plusieurs langues (anglais, français, allemand, espagnol, et russe) le rend utile dans des contextes internationaux et multiculturels.

Et vous ? Qu’en pensez-vous ? Dites-le moi en commentaire 👇👇👇

9 réponses

  1. Un grand merci Claire, très utile. Pour le moment, pas de précisions sur la prise en charge ou non des heures:minutes:secondes, ni sur la vignette, ni dans le pdf CRAN, mais sûrement en cours de développement, à suivre…

  2. Bonjour,
    Merci de nouveau pour cette information, je n’utilisais que lubridate jusqu’alors. Je vais évoluer.
    1/ Concernant Excel, il me semble qu’existe une différence de date d’origine selon Excel/Windows (01/01/1900) et Excel/Mac (01/01/1904). Vieux souvenir où j’utilisais les 2 environnements. Y a t’il moyen de spécifier la date origine ?
    2/ Cet article sur les dates me fait revenir à Jamovi où je ne vois pas de type “date” dans les variables. J’apprécie la vitesse d’import et le découpage de données au format Json, mais les typages de variables me sont apparus mal aisés (une à une) et la création de variable moins simple qu’avec mutate().
    Peut être l’usage des fonctions permet d’améliorer ?
    Je pense que les données doivent être parfaitement propres avant d’être importées. Le nettoyage ne me semble pas permis par Jamovi.
    Merci de votre opinion.
    Et merci encore pour vos infos.

    1. Bonjour Lionel,

      Je ne savais pas qu’Excel utilise 2 systèmes de dates différents en fonction du système d’exploitation window ou Mac, mais il semblerait que vous ayez raison.
      Voici ce que j’ai trouvé pour spécifier la date d’origine dans Excel :
      Sur Windows :

      Allez dans “Fichier” (ou “Office” dans les versions plus anciennes) > “Options”.
      Sélectionnez “Options avancées”.
      Faites défiler jusqu’à la section “Lorsque vous calculez avec Excel”.
      Cochez ou décochez la case “Utiliser le système de dates 1904”.
      Sur Mac :

      Cliquez sur “Excel” dans la barre de menu.
      Sélectionnez “Préférences”.
      Dans la section “Préférences Excel”, cliquez sur “Calcul”.
      Cochez ou décochez la case “Utiliser le système de dates 1904”.

      En plus à priori Windows considère l’année 1900 comme une année bissextile (366 jours) à alors que ce n’est pas vraie !

      Pour votre commentaire sur Jamovi, effectivement, il n’y a pas de format date dans jamovi.En plus on ne garde pas de trace des modifications que l’on fait…Le nettoyage est donc très limité.
      Bonne continuation

  3. Bonjour et milles mercis Claire, je vais essayer et si cela marche, je vais reprendre tous mes Scripts où j’avais séparé le jours, mois et année d’une date selon la présentation par défaut yyyy-mm-dd avant de reconstituer avec “paste” sous le format dd-mm-yyy. Ouf ! C’était épuisant !

Laisser un commentaire

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

Vous souhaitez vous former à R, ou aux statistiques ?

Retrouver le planning et les programmes de  mes formations ici  👇👇👇 

Vous avez besoin d'un assitance pour analyser vos données ?

Retrouver mes propositions de services ici  👇👇👇 

Vous souhaitez soutenir mon travail ?​

C’est possible en faisant un don  sur la page Tipeee du blog  👇👇👇

Bonjour !

vous venez souvent ?

Identifiez-vous pour avoir accès à toutes les fontionnalités !

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches “aide mémoire” (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.