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 !😱
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:
exempledates``(il est inclus dans le package
datefixeR`)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 !
En plus de cette fonction trop chouette, les développeurs ont créé une application shiny avec laquelle vous pouvez :
Pour lancer l’application, utilisez la commande suivante, dans la console R :
fix_date_app()
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"
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“.
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 👇👇👇
Retrouver le planning et les programmes de mes formations ici 👇👇👇
Retrouver mes propositions de services ici 👇👇👇
C’est possible en faisant un don sur la page Tipeee du blog
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.
9 réponses
Merci pour cette information, toujours aussi opérationnelle et agréable à lire.
Merci encore pour cette pépite…
Trop bien, merci beaucoup. Comme souvent, je repense au temps perdu et je me dis si j’avais su ! Maintenant, je sais.
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…
Je suis content de m’avoir fait découvrir ce package qui va m’aider dans le traitement des dates.
Merci beaucoup pour le partage. C’est très gentil
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.
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
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 !