{"id":1,"date":"2014-09-19T15:25:22","date_gmt":"2014-09-19T13:25:22","guid":{"rendered":"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/?p=1"},"modified":"2018-10-01T10:10:21","modified_gmt":"2018-10-01T08:10:21","slug":"dates","status":"publish","type":"post","link":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/dates\/","title":{"rendered":"G\u00e9rer des dates sous R"},"content":{"rendered":"<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Dates\/headband.png\" alt=\"plot of chunk headband\" \/><\/p>\n<p><strong>ATTENTION<\/strong> il y a un billet <strong>plus r\u00e9cent<\/strong> sur ce sujet <a href=\"http:\/\/perso.ens-lyon.fr\/lise.vaudor\/gerer-des-dates-avec-lubridate-un-jeu-denfant\/\">ici<\/a><\/p>\n<h1>Pourquoi la gestion des dates peut-elle poser probl\u00e8me?<\/h1>\n<p>Consid\u00e9rons le jeu de donn\u00e9es <a href=\"..\/..\/lise.vaudor\/Rdata\/Dates\/data_dates.csv\">data_dates.csv<\/a>:<\/p>\n<pre><code>mydata=read.csv(paste(data.path,\"data_dates.csv\", sep=\"\"),sep=\";\", header=T)\nattach(mydata)\nprint(mydata[1:10,])\n\n##      date_evt heure_evt  x\n## 1  22\/07\/2012     06:12 25\n## 2  23\/07\/2012     07:35 30\n## 3  24\/07\/2012     05:05  2\n## 4  24\/07\/2012     20:12  5\n## 5  24\/07\/2012     12:52  3\n## 6  24\/07\/2012     12:07 75\n## 7  25\/07\/2012     15:16  1\n## 8  25\/07\/2012     19:12 25\n## 9  26\/07\/2012     13:06 50\n## 10 27\/07\/2012     02:30 42\n<\/code><\/pre>\n<p>La table monfichier contient trois variables: <code>date_evt<\/code> et <code>heure_evt<\/code> qui correspondent \u00e0 la date et \u00e0 l&rsquo;heure d&rsquo;occurence d&rsquo;un \u00e9v\u00e9nement, et x, qui est mesur\u00e9 lors de chaque \u00e9v\u00e9nement.<\/p>\n<p>Pour R, les variables <code>date_evt<\/code> et <code>heure_evt<\/code> sont des variables de type \u00ab\u00a0facteur\u00a0\u00bb: i.e. R ne reconna\u00eet pas leurs formats et les consid\u00e8re comme de banales cha\u00eenes de caract\u00e8re. Vous pouvez le v\u00e9rifier en tapant:<\/p>\n<pre><code>class(date_evt)\n\n## [1] \"factor\"\n\nclass(heure_evt)\n\n## [1] \"factor\"\n<\/code><\/pre>\n<p>D\u00e8s lors, si vous tentez d&rsquo;analyser x en fonction du temps, vous encourez certains probl\u00e8mes&#8230; Consid\u00e9rons ainsi la figure suivante:<\/p>\n<pre><code>par(las=2,mar=c(6,3,3,1)) # pour afficher les \u00e9tiquettes d'axe perpendiculairement \u00e0 l'axe\nplot(x~date_evt, type=\"b\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Dates\/mafigure1.png\" alt=\"plot of chunk\nmafigure1\" \/><\/p>\n<p>On obtient bien un graphique qui repr\u00e9sente x en fonction de la date. Mais on observe plusieurs probl\u00e8mes:<\/p>\n<ul>\n<li>les dates ne sont pas rang\u00e9es dans le bon ordre (le 22\/07\/12 est ainsi plac\u00e9 apr\u00e8s le 21\/08\/2012). Cela est li\u00e9 au fait que <code>date_evt<\/code> est rang\u00e9 dans l&rsquo;ordre \u00ab\u00a0alphab\u00e9tique\u00a0\u00bb.<\/li>\n<li>les \u00ab\u00a0vides\u00a0\u00bb ne sont pas repr\u00e9sent\u00e9s (par exemple, celui entre le 4 et le 7 ao\u00fbt)<\/li>\n<li>la repr\u00e9sentation est de type \u00ab\u00a0boxplot\u00a0\u00bb, et non de type ligne et points superpos\u00e9s comme on le sp\u00e9cifiait via l&rsquo;option <code>type=\"b\"<\/code><\/li>\n<\/ul>\n<h1>Comment g\u00e9rer des dates?<\/h1>\n<p>Tous ces probl\u00e8mes peuvent \u00eatre r\u00e9gl\u00e9s en changeant la classe de <code>date_evt<\/code>.<\/p>\n<pre><code>par(las=1) # pour que les \u00e9tiquettes des axes soient horizontales\ndate_evt_bis=as.Date(date_evt, format=\"%d\/%m\/%Y\")\nclass(date_evt_bis)\n\n## [1] \"Date\"\n\nplot(x~date_evt_bis, type=\"b\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Dates\/mafigure2.png\" alt=\"plot of chunk\nmafigure2\" \/><\/p>\n<p>Le graphe produit avec la m\u00eame commande, mais avec <code>date_evt_bis<\/code> de classe \u00ab\u00a0Date\u00a0\u00bb<\/p>\n<p>Notez que lors de l&rsquo;appel de la fonction <code>as.Date<\/code>, il faut g\u00e9n\u00e9ralement sp\u00e9cifier quel est le format d&rsquo;origine de la date (ici, jour\/mois\/ann\u00e9e \u00e0 quatre chiffres, ce qui se traduit en \u00ab\u00a0%d%m%Y\u00a0\u00bb). Pour en savoir plus sur la sp\u00e9cification du format date, vous pouvez aller voir l&rsquo;aide de la fonction strptime (commande <code>help(strptime)<\/code>).<\/p>\n<p>On constate ici de multiples changements:<\/p>\n<ul>\n<li>on obtient bien une repr\u00e9sentation de type \u00ab\u00a0b\u00a0\u00bb comme on le souhaitait (donc une courbe avec les points de mesure superpos\u00e9s)<\/li>\n<li>les dates sont bien dans le bon ordre, et les \u00ab\u00a0vides\u00a0\u00bb apparaissent (les points de mesure sont plus ou moins \u00e9cart\u00e9s dans le temps).<\/li>\n<li>du fait que <code>date_evt_bis<\/code> soit de format date, l&rsquo;axe des abscisses produit est \u00ab\u00a0arrang\u00e9\u00a0\u00bb de mani\u00e8re \u00e0 \u00eatre plus facilement lisible. En l&rsquo;occurence, seuls le nom du mois et le jour sont affich\u00e9s et cela \u00e9vite que l&rsquo;axe des abscisses soit surcharg\u00e9&#8230; Ici, le mois est indiqu\u00e9 en fran\u00e7ais, cela est d\u00fb aux param\u00e8tres locaux et peut \u00eatre chang\u00e9 de la mani\u00e8re suivante (par exemple, si vous voulez int\u00e9grer la figure dans un article en anglais):<\/li>\n<\/ul>\n<p><!-- --><\/p>\n<pre><code>Sys.setlocale(\"LC_TIME\",\"English\")\n\n## [1] \"English_United States.1252\"\n\nplot(x~date_evt_bis, type=\"b\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Dates\/mafigure3.png\" alt=\"plot of chunk\nmafigure3\" \/><\/p>\n<p>Pour remettre en fran\u00e7ais:<\/p>\n<pre><code>Sys.setlocale(\"LC_TIME\", \"French\")\n\n## [1] \"French_France.1252\"\n<\/code><\/pre>\n<h1>Comment g\u00e9rer des heures?<\/h1>\n<p>Consid\u00e9rons le graphe produit par la commande <code>plot(x~date_evt_bis)<\/code>. Certaines dates correspondent \u00e0 plusieurs mesures (par exemple le 16 ao\u00fbt), et ces mesures sont superpos\u00e9es sur le graphe. L&rsquo;indication de l&rsquo;heure \u00e0 laquelle ces mesures ont \u00e9t\u00e9 r\u00e9alis\u00e9es pourrait permettre de tracer ces mesures dans l&rsquo;ordre dans lequel elles ont \u00e9t\u00e9 prises. Pour cela, on consid\u00e8re la variable <code>heure_evt<\/code>.<\/p>\n<p>Comme pour <code>date_evt<\/code>, R \u00ab\u00a0ne sait pas\u00a0\u00bb, a priori, qu&rsquo;il s&rsquo;agit d&rsquo;une indication d&rsquo;heure, et consid\u00e8re cette variable comme une variable de type cha\u00eene de caract\u00e8res. Pour indiquer qu&rsquo;il s&rsquo;agit d&rsquo;une variable de format \u00ab\u00a0%H:%M\u00a0\u00bb, il faut faire quelques op\u00e9rations sur ces cha\u00eenes de caract\u00e8res&#8230; On peut proc\u00e9der comme suit:<\/p>\n<pre><code>heure_evt_bis_tmp=strptime(heure_evt, format=\"%H:%M\")\nprint(heure_evt_bis_tmp[1:10])\n\n##  [1] \"2014-10-03 06:12:00\" \"2014-10-03 07:35:00\" \"2014-10-03 05:05:00\" \"2014-10-03 20:12:00\" \"2014-10-03 12:52:00\" \"2014-10-03 12:07:00\" \"2014-10-03 15:16:00\" \"2014-10-03 19:12:00\" \"2014-10-03 13:06:00\" \"2014-10-03 02:30:00\"\n\nheure_evt_bis=format(heure_evt_bis_tmp, \"%H:%M:%S\")\nprint(heure_evt_bis[1:10])\n\n##  [1] \"06:12:00\" \"07:35:00\" \"05:05:00\" \"20:12:00\" \"12:52:00\" \"12:07:00\" \"15:16:00\" \"19:12:00\" \"13:06:00\" \"02:30:00\"\n<\/code><\/pre>\n<p>La premi\u00e8re ligne de code (appel de <code>strptime<\/code>) indique \u00e0 R sous quel format consid\u00e9rer <code>heure_evt<\/code>. Il prend en entr\u00e9e une variable de type cha\u00eene de caract\u00e8res (<code>heure_evt<\/code>}). La nouvelle variable, <code>heure_evt_bis_tmp<\/code>, est de classe \u00ab\u00a0POSIXlt-POSIXct\u00a0\u00bb, qui repr\u00e9sente des dates et heures. Toute variable de cette classe comprend a priori une date: \u00e0 d\u00e9faut d&rsquo;en lire une dans <code>heure_evt<\/code>, R assigne la date d&rsquo;aujourd&rsquo;hui \u00e0 <code>heure_evt_bis_tmp<\/code>. La troisi\u00e8me ligne (appel de \u00ab\u00a0format\u00a0\u00bb) reformatte <code>heure_evt_bis_tmp<\/code> de mani\u00e8re \u00e0 ce que <code>heure_evt_bis<\/code> ne fasse r\u00e9f\u00e9rence qu&rsquo;\u00e0 l&rsquo;heure.<\/p>\n<p>Pour produire un graphe ayant le moment exact de prise de mesure en abscisse, il faudrait en fait \u00ab\u00a0coller\u00a0\u00bb ensemble les variables <code>date_evt_bis<\/code> et <code>heure_evt_bis<\/code>. C&rsquo;est chose faite dans la figure suivante.<\/p>\n<pre><code>moment_evt=paste(date_evt_bis, heure_evt_bis)# moment est une cha\u00eene de caract\u00e8res\nmoment_evt_bis=strptime(moment_evt, format=\"%Y-%m-%d %H:%M:%S\") # on indique le format de moment \n\no=order(moment_evt_bis)\nplot(moment_evt_bis[o],x[o],type=\"b\")\n<\/code><\/pre>\n<p><img decoding=\"async\" src=\"..\/..\/lise.vaudor\/Rfigures\/Dates\/mafigure4.png\" alt=\"plot of chunk\nmafigure4\" \/><\/p>\n<p>Le graphe produit avec <code>moment_evt<\/code> (indiquant le jour et l&rsquo;heure) en abscisse<\/p>\n<p><strong>Remarque:<\/strong><\/p>\n<p>La fonction <code>strptime<\/code> permet de prendre une variable de type cha\u00eene de caract\u00e8res en entr\u00e9e et de pr\u00e9ciser son format, et renvoie une variable de type POSIXlt-POSIXct. La fonction <code>as.Date<\/code> prend en entr\u00e9e une variable de type cha\u00eene de caract\u00e8res (si celle-ci est sous un format directement reconnu comme date) ou une variable de type POSIXlt-POSIXct (pour laquelle le format a \u00e9t\u00e9 pr\u00e9cis\u00e9) et renvoie une variable de type date. La fonction <code>format<\/code> prend en entr\u00e9e une variable de type date ou POSIXlt-POSIXct et renvoie une variable de type date ou POSIXlt-POSIXct (mais sous un nouveau format)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ATTENTION il y a un billet plus r\u00e9cent sur ce sujet ici Pourquoi la gestion des dates peut-elle poser probl\u00e8me? Consid\u00e9rons le jeu de donn\u00e9es data_dates.csv: mydata=read.csv(paste(data.path,\u00a0\u00bbdata_dates.csv\u00a0\u00bb, sep=\u00a0\u00bb\u00a0\u00bb),sep=\u00a0\u00bb;\u00a0\u00bb, header=T) attach(mydata) print(mydata[1:10,]) ## date_evt heure_evt x ## 1 22\/07\/2012 06:12 25 ## 2 23\/07\/2012 07:35 30 ## 3 24\/07\/2012 05:05 2 ## 4 24\/07\/2012 20:12 5 ## 5 24\/07\/2012 12:52 3 ## 6 24\/07\/2012 12:07 75 ## 7 25\/07\/2012 15:16 1.. <a href=\"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/dates\/\">Read More<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[],"class_list":["post-1","post","type-post","status-publish","format-standard","hentry","category-tous-les-posts"],"_links":{"self":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/comments?post=1"}],"version-history":[{"count":23,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1\/revisions"}],"predecessor-version":[{"id":995,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/posts\/1\/revisions\/995"}],"wp:attachment":[{"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/media?parent=1"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/categories?post=1"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/perso.ens-lyon.fr\/lise.vaudor\/wp-json\/wp\/v2\/tags?post=1"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}