Date and time with R - Département de Mathématiques
Transcription
Date and time with R - Département de Mathématiques
Université de Caen Basse-Normandie 1 12 septembre 2013 Département de Mathématiques et Mécanique Le temps Sommaire 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.1 Dates, heures et zones . . . . . . . . . . . . . . Les fuseaux horaires ou les zones . . . . . . . . Régionaliser son unix : locale . . . . . . . . . . La classe POSIXct . . . . . . . . . . . . . . . . . La classe POSIXlt . . . . . . . . . . . . . . . . . Convertion datetime vers chaine de caractères Choix de la langue . . . . . . . . . . . . . . . . . Convertion chaines vers datetime . . . . . . . . Opérations sur les temps . . . . . . . . . . . . . Les zones . . . . . . . . . . . . . . . . . . . . . . Heure d’été, heure d’hiver . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 2 3 3 4 5 6 6 Dates, heures et zones Les temps sont décrits générallement par trois quantités : la date, l’horaire et fuseau horaire, par exemple date 11 setembre 2001 horaire 8 h 46mn zone UTC -4 New York Etas Unis Le temps absolu ou Coordinated Universal Time, en abrégé UTC est calculé à l’aide de pile atomique avec une très grande précision. Ce temps est approximativement égal au temps appelé Greenwich Mean Time (GMT). Dans cet exercice on étudie les classes informatiques de R permettant de gérer ces dates et heures. Le nom générique informatique décrivant les caractéristiques de ces objets est DateTime. On pourra étudier l’aide de R ?DateTimeClasses. PHP DateTime Class Python Basic date and time types MySQL Les types DATETIME, DATE, et TIMESTAMP Microsoft Chaı̂nes de format de date et d’heure standard 1.2 Les fuseaux horaires ou les zones Les temps regionaux sont des affichages de ce temps absolu en fonction du fuseau horaire ou zone de la région. Par exemple CET Central European Time=UTC+0100 CEST Central European Summer Time =UTC+0200 EDT Eastern Daylight Time (summer)=UTC-0400 New-York EDT Eastern Daylight Time (winter)=UTC-0500 NZDT New Zealand Daylight Time summer =UTC +1300 NZST New Zealand Standard Time winter =UTC +1200 Une liste des abréviations des zones peut être trouvée à http://www.timeanddate.com/library/abbreviations/timezones/ 1.3 Régionaliser son unix : locale Les propriétés locales de votre OS sont accessibles avec les fonctions suivantes. On peut en particulier savoir si on utilise le codage latin1 (windows) ou utf8 (linux) dans R. > Sys.getlocale() [1] "LC_CTYPE=fr_FR.UTF-8;LC_NUMERIC=C;LC_TIME=fr_FR.utf8;LC_COLLATE=fr_FR.UTF-8;LC_MONETARY=fr_FR.UTF-8;LC_M > l10n_info() # info locale ans R http://www.math.unicaen.fr/~kauffman/cours 1 [email protected] Université de Caen Basse-Normandie 12 septembre 2013 Département de Mathématiques et Mécanique $MBCS [1] TRUE $`UTF-8` [1] TRUE $`Latin-1` [1] FALSE Depuis un terminal, on peut interroger le systeme avec l’aide de la commande locale ou locale -a francois@kauffmannpt:~> locale LANG=fr_FR.UTF-8 LC_CTYPE="fr_FR.UTF-8" LC_NUMERIC="fr_FR.UTF-8" LC_TIME="fr_FR.UTF-8" LC_COLLATE="fr_FR.UTF-8" LC_MONETARY="fr_FR.UTF-8" LC_MESSAGES="fr_FR.UTF-8" LC_PAPER="fr_FR.UTF-8" LC_NAME="fr_FR.UTF-8" LC_ADDRESS="fr_FR.UTF-8" LC_TELEPHONE="fr_FR.UTF-8" LC_MEASUREMENT="fr_FR.UTF-8" LC_IDENTIFICATION="fr_FR.UTF-8" LC_ALL= 1.4 La classe POSIXct La classe POSIXct décrit le temps comme le nombre de secondes écoulé depuis l’ origine choisie arbitrairement le premier janvier 1970 0h :00:00 UTC. Un attribut de type zone peut associé à cette classe. > h=Sys.time() > str(h) POSIXct[1:1], format: "2013-09-12 18:42:24" > unclass(h) [1] 1379004144 1.5 La classe POSIXlt La classe POSIXlt décrit les temps comme une liste dont les champs sont les secondes, minutes, heures, jour, mois ,année (depuis 1900).... > h=as.POSIXlt(Sys.time()) > str(h) POSIXlt[1:1], format: "2013-09-12 18:42:24" > str(unclass(h)) List of $ sec $ min $ hour $ mday 9 : : : : num int int int 24.1 42 18 12 http://www.math.unicaen.fr/~kauffman/cours 2 [email protected] Université de Caen Basse-Normandie $ $ $ $ $ - 12 septembre 2013 Département de Mathématiques et Mécanique mon : int 8 year : int 113 wday : int 4 yday : int 254 isdst: int 1 attr(*, "tzone")= chr [1:3] "" "CET" "CEST" > h$year;h$sec [1] 113 [1] 24.11129 1.6 Convertion datetime vers chaine de caractères La fonction générique est la fonction format, les formats peuvent être trouvé à l’aide de la fonction strptime. > format(Sys.time(),"%d%B%y") [1] "12septembre13" 1.7 Choix de la langue On peut spécifier la langue utilisée pour afficher les dates. > Sys.setlocale("LC_TIME", "fr_FR.utf8");format(Sys.time(),"%d%B%y") # francais [1] "fr_FR.utf8" [1] "12septembre13" > Sys.setlocale("LC_TIME", "de_DE.utf8") ;format(Sys.time(),"%d%B%y") # allemand [1] "de_DE.utf8" [1] "12September13" > Sys.setlocale("LC_TIME", "en_US.utf8");format(Sys.time(),"%d%B%y") # anglais [1] "en_US.utf8" [1] "12September13" > h=Sys.time() > str(h) POSIXct[1:1], format: "2013-09-12 18:42:24" > str(unclass(h)) num 1.38e+09 http://www.math.unicaen.fr/~kauffman/cours 3 [email protected] Université de Caen Basse-Normandie 12 septembre 2013 Département de Mathématiques et Mécanique > str(unclass(as.POSIXct(h))) num 1.38e+09 > str(unclass(as.POSIXlt(h))) List of 9 $ sec : num 24.1 $ min : int 42 $ hour : int 18 $ mday : int 12 $ mon : int 8 $ year : int 113 $ wday : int 4 $ yday : int 254 $ isdst: int 1 - attr(*, "tzone")= chr [1:3] "" "CET" "CEST" 1.8 Convertion chaines vers datetime La fonction strptime permet de convertir des dates en caractères au format POSIXct et POSIXlt > # date en français > > Sys.setlocale("LC_TIME", "fr_FR.utf8"); [1] "fr_FR.utf8" > chaine="09sept.11" > h=strptime("09sept.11","%d%b%y") > format(h, "%a %b %d %X %Y %Z") [1] "ven. sept. 09 00:00:00 2011 CEST" > h$yday;h$mon [1] 251 [1] 8 > > > > > > > # convertions vecteurs char vers POSIXlt dates <- c("02/27/92", "02/27/92", "01/14/92", "02/28/92", "02/01/92","09/13/11") times <- c("23:03:20", "22:29:56", "01:03:30", "18:21:03", "16:56:26", "08:30:00") x <- paste(dates, times) datetimes=strptime(x, "%m/%d/%y %H:%M:%S") format(datetimes,"%m/%d/%y %H:%M:%S %Z") [1] "02/27/92 23:03:20 CET" [4] "02/28/92 18:21:03 CET" "02/27/92 22:29:56 CET" "02/01/92 16:56:26 CET" "01/14/92 01:03:30 CET" "09/13/11 08:30:00 CEST" > http://www.math.unicaen.fr/~kauffman/cours 4 [email protected] Université de Caen Basse-Normandie 1.9 12 septembre 2013 Département de Mathématiques et Mécanique Opérations sur les temps > h+3600 # ajout d'une heure [1] "2011-09-09 01:00:00 CEST" > h-3600 # retrait d'une heure [1] "2011-09-08 23:00:00 CEST" > as.numeric(h) # nb secondes depuis 1 janvier 1970 [1] 1315519200 > unclass(h) $sec [1] 0 $min [1] 0 $hour [1] 0 $mday [1] 9 $mon [1] 8 $year [1] 111 $wday [1] 5 $yday [1] 251 $isdst [1] 1 > h0=Sys.time() > h1=Sys.time() > h1-h0 Time difference of 0.0002810955 secs > h0-h1 Time difference of -0.0002810955 secs http://www.math.unicaen.fr/~kauffman/cours 5 [email protected] Université de Caen Basse-Normandie 1.10 > > > > > 12 septembre 2013 Département de Mathématiques et Mécanique Les zones h=Sys.time() h.paris =as.POSIXlt(h, tz="CEST") h.new_york =as.POSIXlt(h, tz="America/New_York") h.los_angeles=as.POSIXlt(h, tz="America/Los_Angeles") h.paris- h.new_york # pourquoi ? # heure à Paris # heure à New-York # heure à Los-Angeles Time difference of 0 secs > c(as.numeric(as.POSIXct(h.paris)), + as.numeric(as.POSIXct(h.new_york)), + as.numeric(as.POSIXct(h.los_angeles))) [1] 1379004144 1379004144 1379004144 1.11 Heure d’été, heure d’hiver Trouvez la date et l’heure du passage de l’horaire d’été à l’horaire d’hiver. Calculez ces deux, faites la différence. > h.ete =strptime("30/10/2011 02:59:59", "%d/%m/%Y %H:%M") > h.hiver =strptime("30/10/2011 02:01:00", "%d/%m/%Y %H:%M") > format(h.hiver,"%a, %d %b %Y %H:%M:%S %Z") [1] "dim., 30 oct. 2011 02:01:00 CET" > format(h.ete,"%a, %d %b %Y %H:%M:%S %Z") [1] "dim., 30 oct. 2011 02:59:00 CET" > h.hiver-h.ete # bug Time difference of -58 mins > h.ete =strptime("27/03/2011 03:00:01", "%d/%m/%Y %H:%M") > h.hiver =strptime("27/03/2011 01:59:59", "%d/%m/%Y %H:%M") > format(h.hiver,"%a, %d %b %Y %H:%M:%S %Z") [1] "dim., 27 mars 2011 01:59:00 CET" > format(h.ete,"%a, %d %b %Y %H:%M:%S %Z") [1] "dim., 27 mars 2011 03:00:00 CEST" > h.hiver-h.ete # 1min Time difference of -1 mins http://www.math.unicaen.fr/~kauffman/cours 6 [email protected]