conversion d'une date en nombre décimal

Postez ici vos questions, réponses, commentaires ou suggestions - Les sujets seront ultérieurement répartis dans les archives par les modérateurs

Modérateur : Groupe des modérateurs

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

conversion d'une date en nombre décimal

Messagepar Stephan Defoy » 08 Juin 2020, 15:14

Bonjour,

J'ai du mal à m'en sortir, je souhaiterais tracer une courbe en fonction de la date. Voici une illustration des valeurs.
head(don_test)
date T decade jour
1 2005042312 35.0 2005043 2005000
2 2008072100 24.0 2008073 2008001
3 2009101106 24.3 2009102 2009001
4 2010071818 28.1 2010072 2010001
5 2014091906 23.5 2014092 2014001
6 2015070212 30.2 2015071 2015001

Pour ma 1ere colonne, la date est codé en an/mois/jours/heure, la seconde colonne correspond au paramètre que je souhaite tracer, la température, la 3eme et la 4eme colonne permettent de compter les decades et les jours. Si je laisse la date telle quelle, les valeurs sont concentrées sur les 12 premières valeurs des abscisses car il y a 12 mois dans l'année, j'ai donc converti la date en jour par cette formule.

Code : Tout sélectionner

don_test$jour=as.numeric(paste0(365*as.integer(substr(don_test$date,1,4)),30*as.integer(substr(don_test$date,5,6))+as.                                integer(substr(don_test$date,7,8))))/365

Le souci est que R me converti en entier le résultat, sans que je comprenne pourquoi. Si je fais des tests, il semble me faire ce résultat lorsque le nombre est relativement grand :

Code : Tout sélectionner

150/7
[1] 21.42857
731825140/7
[1] 104546449


Pour info, je ne peux pas utiliser la fonction "lubridate" qui me permettrait d'utiliser la fonction "yday".
Merci d'avance pour votre éclairage,

Stéphan,

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: conversion d'une date en nombre décimal

Messagepar Mickael Canouil » 08 Juin 2020, 15:55

Bonjour,

il y a des fonctions pour gérer les dates.
Je vous invite à vous documenter sur le format date de façon générale et également au sein de R (date, posixct, posixlt, etc.).

Code : Tout sélectionner

??date
help
("date"

Je n'ai pas compris grand-chose (et pas trop essayé non plus) à vos opérations étranges et à votre "problème" de "concentration des points".

Code : Tout sélectionner

dta <- read.table(text = "date T decade jour
1 2005042312 35.0 2005043 2005000
2 2008072100 24.0 2008073 2008001
3 2009101106 24.3 2009102 2009001
4 2010071818 28.1 2010072 2010001
5 2014091906 23.5 2014092 2014001
6 2015070212 30.2 2015071 2015001"
, header = TRUE)

dta[["date"]] <- as.POSIXct(as.character(dta[["date"]]), format = "%Y%m%d%H")

library("ggplot2")
ggplot(data = dta, mapping = aes(= date, y = T)) +
  geom_line() +
  scale_x_datetime(date_breaks = "5 years")
 

Image

Code : Tout sélectionner

dta[["jour"]] <- format(dta[["date"]], format = "%j")
dta
#>                  date    T  decade jour
#> 1 2005-04-23 12:00:00 35.0 2005043  113
#> 2 2008-07-21 00:00:00 24.0 2008073  203
#> 3 2009-10-11 06:00:00 24.3 2009102  284
#> 4 2010-07-18 18:00:00 28.1 2010072  199
#> 5 2014-09-19 06:00:00 23.5 2014092  262
#> 6 2015-07-02 12:00:00 30.2 2015071  183   


Cordialement,
Mickaël
mickael.canouil.fr | rlille.fr

Stephan Defoy
Messages : 59
Enregistré le : 19 Déc 2019, 14:07

Re: conversion d'une date en nombre décimal

Messagepar Stephan Defoy » 08 Juin 2020, 16:03

Je comprends tout à fait votre incompréhension concernant la concentration des points sur mon graphique. Je regarde attentivement votre réponse, merci beaucoup !

Stéphan,

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

Re: conversion d'une date en nombre décimal

Messagepar camille garcin » 16 Juin 2020, 08:09

Code : Tout sélectionner

dta <- read.table(text = "date T decade jour
1 2005042312 35.0 2005043 2005000
2 2008072100 24.0 2008073 2008001
3 2009101106 24.3 2009102 2009001
4 2010071818 28.1 2010072 2010001
5 2014091906 23.5 2014092 2014001
6 2015070212 30.2 2015071 2015001", header = TRUE)

Pour convertir votre variable en date

Code : Tout sélectionner

> dta$date2<-as.Date(substr(dta$date,1,8),format = "%Y%m%d")
> dta$date2
[1] "2005-04-23" "2008-07-21" "2009-10-11" "2010-07-18" "2014-09-19"
[6] "2015-07-02"

A vous ensuite d’adapter le graphique à vos besoins

Code : Tout sélectionner

plot(T~date2,data=dta)
CG

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: conversion d'une date en nombre décimal

Messagepar Mickael Canouil » 16 Juin 2020, 08:56

Si je peux me permettre, cette solution était déjà donnée (ainsi que la façon de reproduire lubridate::yday en R base), avec une approche utilisant le format complet de la date de l'exemple fourni, sans faire d'opération d'extraction de chaîne de caractère.

Code : Tout sélectionner

dta[["date"]] <- as.POSIXct(as.character(dta[["date"]]), format = "%Y%m%d%H")
Mickaël
mickael.canouil.fr | rlille.fr

camille garcin
Messages : 76
Enregistré le : 24 Nov 2009, 10:07

Re: conversion d'une date en nombre décimal

Messagepar camille garcin » 16 Juin 2020, 09:53

Mis à part le fait que votre solution soit plus élégante car elle affecte directement un type 'Date' à la variable, quel est l'inconvénient à faire une extraction de chaine dans ce cas ?
CG

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: conversion d'une date en nombre décimal

Messagepar Mickael Canouil » 16 Juin 2020, 11:49

Le principal inconvénient est l'hypothèse implicite que les 8 premiers caractères de la variable date sont systématiquement les caractères correspondant à l'année (4), le mois (2) et le jour (2) et que les caractères suivants sont inutiles/ non informatifs.
A la moindre exception, le comportement n'est plus garantie (c'est aussi en partie vrai avec as.POSIXct/as.character, mais moins "grave").

Lorsque l'on importe des données, on veut normalement à cette étape avoir 100 % des données de la source et que celles-ci aient les "bons" types.
Ici, les dates sont au format année/mois/jour/heure.

Ceci étant dit, le as.Date/substr est plus performant que as.POSIXct/as.character, mais ces derniers conservent l'intégralité de 'information.

Code : Tout sélectionner

benchr::benchmark(
as.
POSIXct(as.character(dta$date), format "%Y%m%d%H"),
as.
Date(substr(dta$date18), format "%Y%m%d")
)
#> Benchmark summary:
#> Time units : microseconds 
#>                                                     expr n.eval min lw.qu median mean up.qu   max  total relative
#>  as.POSIXct(as.character(dta$date), format = "%Y%m%d%H")    100 250 667.0   1100 1630  2100 13800 163000     2.86
#>       as.Date(substr(dta$date, 1, 8), format = "%Y%m%d")    100  40  83.2    385  597   733  5670  59700     1.00 
Mickaël
mickael.canouil.fr | rlille.fr

Logez Maxime
Messages : 3138
Enregistré le : 26 Sep 2006, 11:35

Re: conversion d'une date en nombre décimal

Messagepar Logez Maxime » 16 Juin 2020, 11:56

Bonjour,
Mickael Canouil a écrit :Le principal inconvénient est l'hypothèse implicite que les 8 premiers caractères de la variable date sont systématiquement les caractères correspondant à l'année (4), le mois (2) et le jour (2).
A la moindre exception, le comportement n'est plus garantie.
Il me semble qu'il en va de même quand on utilise le as.POSIXct avec l'argument format. Du coup je ne vois pas trop la différence entre les deux dans ce cas.

Cordialement,
Maxime

Mickael Canouil
Messages : 1315
Enregistré le : 04 Avr 2011, 08:53
Contact :

Re: conversion d'une date en nombre décimal

Messagepar Mickael Canouil » 16 Juin 2020, 11:59

Logez Maxime a écrit :Bonjour,
Mickael Canouil a écrit :Le principal inconvénient est l'hypothèse implicite que les 8 premiers caractères de la variable date sont systématiquement les caractères correspondant à l'année (4), le mois (2) et le jour (2).
A la moindre exception, le comportement n'est plus garantie.
Il me semble qu'il en va de même quand on utilise le as.POSIXct avec l'argument format. Du coup je ne vois pas trop la différence entre les deux dans ce cas.

Cordialement,
Maxime

En effet, j'ai édité mon message entre temps pour être plus précis.
C'est surtout la perte d'information qui peut être problématique selon l'usage.
Concrètement, le %H" impose un sens aux deux derniers caractère et contribuent à l'intégrité de la variable, quant substr ignore l'information de la source.
Mickaël
mickael.canouil.fr | rlille.fr


Retourner vers « Questions en cours »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité