Utilisation de dates en langage R (fonctionnalités de base, ainsi que les packages lubridate et timeperiodsR)

Obtenez la date actuelle dans n'importe quel langage de programmation, une opération équivalente à "Hello world!" Le langage R ne fait pas exception.


Dans cet article, nous allons examiner le fonctionnement des dates dans la syntaxe R de base, ainsi que quelques packages utiles qui étendent ses capacités lors de l'utilisation de dates:


  • lubridate - un package qui permet des calculs arithmétiques entre les dates;
  • timeperiodsR - un package pour travailler avec des intervalles de temps et leurs composants.




Table des matières


  1. Utilisation de dates dans la syntaxe de base R
    1.1. Convertir le texte en date
    1.2. Récupération des composants de date dans Base R
  2. Travailler avec des dates avec le package lubridate
    2.1. Convertir du texte en date à l'aide de Lubrifier
    2.2. Récupération des composants de date à l'aide du package lubridate
    2.3. Opérations arithmétiques avec dates
  3. Travail simplifié avec périodes, package timeperiodsR
    3.1. Intervalles de temps en timeperiodsR
    3.2. Filtrage d'un vecteur de date avec timeperiodsR
  4. Conclusion



Utilisation de dates dans la syntaxe de base R


Convertir le texte en date


Dans R de base, il existe un ensemble de fonctions pour travailler avec les dates. Le moins de la syntaxe de base est que le registre des noms et des arguments des fonctions est très fragmenté et n'a pratiquement pas de connexion logique. Néanmoins, les fonctions de base du langage doivent être connues, nous allons donc commencer par elles.


Le plus souvent, lors du chargement de données dans R, à partir de fichiers csv ou d'autres sources, vous obtenez la date sous forme de texte. Pour as.Date() ce texte en type de données correct, utilisez la fonction as.Date() .


 #      my_dates <- c("2019-09-01", "2019-09-10", "2019-09-23") #    class(my_dates) 

 #> [1] "character" 

 #     my_dates <- as.Date(my_dates) #    class(my_dates) 

 #> [1] "Date" 

Par défaut, as.Date() accepte une date dans deux formats: AAAA-MM-JJ ou AAAA / MM / JJ .
Si les dates de votre ensemble de données sont dans un autre format, vous pouvez utiliser l'argument format pour la conversion.


 as.Date("September 26, 2019", format = "%B %d, %Y") 

format accepte sous forme d'opérateurs sous forme de chaîne indiquant tout intervalle de temps et son format, les valeurs les plus fréquemment utilisées sont indiquées dans le tableau ci-dessous:


FormatLa description
% dNuméro du jour en mois
% aAbréviation du nom du jour de la semaine
% ANom complet du jour de la semaine
% wNuméro du jour de la semaine (0-6, où 0 est le dimanche)
% mDésignation du mois à deux chiffres (01-12)
% bAbréviation du nom du mois (avril, mars, ...)
% BNom du mois complet
% yDésignation de l'année à deux chiffres
% YDésignation de l'année à quatre chiffres
% jNuméro de jour de l'année (001 - 366)
% UNuméro de semaine de l'année (00 - 53), début de semaine dimanche
% WNuméro de semaine de l'année (00-53), début de semaine lundi

Par conséquent, «26 septembre 2019» est le nom complet du mois, du jour et de l'année. Vous pouvez décrire ce format de date avec les opérateurs comme suit: "%B %d, %Y" .


Où:


  • %B - Nom complet du mois
  • %d - Numéro du jour du mois
  • %Y - Désignation de l'année à quatre chiffres

Lors de la description du format de date, il est important d'inclure tous les caractères supplémentaires de votre chaîne, tels que des tirets, des virgules, des points, des espaces, etc. Dans mon exemple, "26 septembre 2019", une virgule est placée après la date et une virgule doit également être placée dans la description du format: "%B %d, %Y" .


Dans certaines situations, vous obtenez une date non seulement non conforme aux formats standard (AAAA-MM-JJ ou AAAA / MM / JJ) , mais également dans une langue qui diffère du paramètre par défaut de votre système d'exploitation. Par exemple, vous avez téléchargé des données dont la date est indiquée sous la forme suivante: "15 décembre 2019". Avant de convertir cette chaîne en une date, vous devez modifier les paramètres régionaux.


 #   Sys.setlocale("LC_TIME", "Russian") #     as.Date(" 15, 2019 .", format = "%B %d, %Y") 

Récupération des composants de date dans Base R


Il n'y a pas beaucoup de fonctions dans R de base qui vous permettent d'extraire n'importe quelle partie d'une date d'un objet de la classe Date .


 current_date <- Sys.Date() #   weekdays(current_date) #     months(current_date) #      quarters(current_date) #      

En plus de la classe principale d'objets Date dans le R de base, il existe 2 autres types de données qui stockent l'horodatage: POSIXlt , POSIXct . La principale différence entre ces classes et Date est qu'elles stockent l'heure en plus de la date.


 #      current_time <- Sys.time() #    current_time class(current_time) 

 # "POSIXct" "POSIXt" 

La fonction Sys.time() renvoie la date et l'heure actuelles au format POSIXct . Ce format a une signification similaire à UNIXTIME et stocke le nombre de secondes depuis le début de l'ère UNIX (minuit (UTC) du 31 décembre 1969 au 1er janvier 1970) .


La classe POSIXlt stocke également l'heure et la date et tous leurs composants. Par conséquent, c'est un objet avec une structure plus complexe, mais à partir duquel il est facile d'obtenir n'importe quel composant de la date et de l'heure car essentiellement POSIXlt est une liste .


 #      current_time_ct <- Sys.time() #    POSIXlt current_time_lt <- as.POSIXlt(current_time_ct) #      current_time_lt$sec #  current_time_lt$min #  current_time_lt$hour #  current_time_lt$mday #   current_time_lt$mon #  current_time_lt$year #  current_time_lt$wday #   current_time_lt$yday #   current_time_lt$zone #   

La conversion des données numériques et textuelles aux formats POSIX * est effectuée par les fonctions as.POSIXct() et as.POSIXlt() . Ces fonctions ont un petit ensemble d'arguments.


  • x - Le nombre, la chaîne ou l'objet de la classe Date à convertir;
  • tz - Fuseau horaire, la valeur par défaut est "GMT";
  • format - Description du format de date dans lequel les données transmises dans l'argument x sont présentées;
  • origin - Utilisé uniquement lors de la conversion d'un nombre en POSIX, vous devez passer un objet date à cet argument et l'heure à partir de laquelle les secondes sont comptées. Généralement utilisé pour la traduction à partir d'UNIXTIME.

Si vos données de date et d'heure sont présentées dans UNIXTIME , utilisez l'exemple suivant pour les convertir en une date compréhensible et lisible:


 #  UNIXTIME    as.POSIXlt(1570084639, origin = "1970-01-01") 

À l'origine, vous pouvez spécifier n'importe quel horodatage. Par exemple, si dans vos données la date et l'heure sont indiquées en nombre de secondes à partir du 15 septembre 2019 12:15, alors pour les convertir en date, utilisez:


 #  UNIXTIME       15  2019 12:15 as.POSIXlt(1546123, origin = "2019-09-15 12:15:00") 

Travailler avec des dates avec le package lubridate


lubridate peut lubridate être le package le plus populaire pour travailler avec des dates dans R. Il vous offre trois autres classes supplémentaires.


  • durées - durée, c.-à-d. nombre de secondes entre deux horodatages;
  • périodes - les périodes vous permettent d'effectuer des calculs entre des dates d'intervalles lisibles par l'homme: jours, mois, semaines, etc.
  • intervalles - objets fournissant le point initial et final dans le temps.

L'installation de packages supplémentaires en langage R est effectuée par la fonction standard install.packages() .


Installation du paquet de lubridate :


 install.packages("lubridate") 

Convertir le texte en date à l'aide de Lubridate


Les fonctions du package lubridate simplifient considérablement le processus de conversion de texte en date et vous permettent également d'effectuer toutes les opérations arithmétiques avec des dates et des heures.


Les fonctions today() et now() vous aideront à obtenir la date actuelle, ou la date et l'heure.


 today() #   now() #     

Pour convertir une chaîne en date, lubridate dispose de toute une famille de fonctions dont les noms se composent toujours de trois lettres et indiquent une séquence de composants de date:


  • y - année
  • m - mois
  • d - jour

Liste des fonctions pour convertir du texte à ce jour via lubridate
  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Quelques exemples de conversion de chaînes en dates:


 ymd("2017 jan 21") mdy("March 20th, 2019") dmy("1st april of 2018") 

Comme vous pouvez le voir, lubridate beaucoup plus efficace pour reconnaître les descriptions de date sous forme de texte et vous permet de convertir du texte en date sans utiliser d'opérateurs supplémentaires pour décrire le format.


Récupération des composants de date à l'aide du package lubridate


En utilisant également lubridate vous pouvez obtenir n'importe quel composant à partir d'une date:


 dt <- ymd("2017 jan 21") year(dt) #  month(dt) #  mday(dt) #    yday(dt) #    wday(dt) #   

Opérations arithmétiques avec dates


Mais, la fonctionnalité la plus importante et la plus élémentaire du lubridate est la capacité d'effectuer diverses opérations arithmétiques avec des dates.


L'arrondi d'une date est assuré par trois fonctions:


  • floor_date - arrondi à l'heure passée la plus proche
  • ceiling_date - arrondi au futur proche
  • round_date - arrondi à l'heure la plus proche

Chacune de ces fonctions a un argument d' unité , qui vous permet de spécifier une unité d'arrondi: seconde, minute, heure, jour, semaine, mois, bimestre, trimestre, saison, demi-année, année


 dt <- ymd("2017 jan 21") round_date(dt, unit = "month") #    round_date(dt, unit = "3 month") #   3  round_date(dt, unit = "quarter") #    round_date(dt, unit = "season") #    round_date(dt, unit = "halfyear") #    

Voyons donc comment obtenir une date qui sera 8 jours après la date actuelle et effectuons divers autres calculs arithmétiques entre deux dates.


 today() + days(8) #     8  today() - months(2) #    2   today() + weeks(12) #     12  today() - years(2) #    2   

Travail simplifié avec des périodes, package timeperiodsR.


timeperiodsR est un nouveau package pour travailler avec des dates qui a été publié sur CRAN en septembre 2019.


Installation du package timeperiodsR :


 install.packages("timeperiodsR") 

Le but principal est de déterminer rapidement un certain intervalle de temps par rapport à une date donnée. Par exemple, en utilisant ses fonctions, vous pouvez facilement:


  • Obtenez la semaine dernière, le mois, le trimestre ou l'année en R.
  • Obtenez un nombre donné de plages horaires par rapport à une date, comme les 4 dernières semaines.
  • Il est facile d'extraire ses composants de l'intervalle de temps obtenu: les dates de début et de fin, le nombre de jours qui tombent dans l'intervalle, la séquence complète des dates qui y entrent.

Le nom de toutes les fonctions du package timeperiodsR intuitif et se compose de deux parties: direction _ intervalle , où:


  • direction dans laquelle il faut se déplacer par rapport à une date donnée: last_n, previous, this, next, next_n.
  • intervalle de temps pour le calcul de la période: jour, semaine, mois, trimestre, année.

Ensemble complet de fonctionnalités:
  • last_n_days()
  • last_n_weeks()
  • last_n_months()
  • last_n_quarters()
  • last_n_years()
  • previous_week()
  • previous_month()
  • previous_quarter()
  • previous_year()
  • this_week()
  • this_month()
  • this_quarter()
  • this_year()
  • next_week()
  • next_month()
  • next_quarter()
  • next_year()
  • next_n_days()
  • next_n_weeks()
  • next_n_months()
  • next_n_quarters()
  • next_n_years()
  • custom_period()

Intervalles de temps en timeperiodsR


Ces fonctions sont utiles lorsque vous devez créer des rapports basés sur les données de la dernière semaine ou du dernier mois. Pour obtenir le dernier mois, utilisez la fonction du même nom previous_month() :


 prmonth <- previous_month() 

Après quoi, vous aurez un objet prprth de la classe tpr , à partir duquel vous pourrez facilement obtenir les composants suivants:


  • la date de début de la période, dans notre exemple, c'est le dernier mois
  • date de fin de période
  • le nombre de jours inclus dans la période
  • séquence de dates incluses dans la période

De plus, vous pouvez obtenir chacun des composants de différentes manières:


 #    prmonth$start start(prmonth) #    prmonth$end end(prmonth) #   prmonth$sequence seq(prmonth) #      prmonth$length length(prmonth) 

Vous pouvez également obtenir l'un des composants à l'aide de l'argument part , qui est présent dans chacune des fonctions du package. Valeurs possibles: début, fin, séquence, longueur.


 previous_month(part = "start") #   previous_month(part = "end") #   previous_month(part = "sequence") #   previous_month(part = "length") #     

timeperiodsR tous les arguments disponibles dans les fonctions du package timeperiodsR :


  • x - La date de référence à partir de laquelle la période sera calculée; par défaut, la date actuelle;
  • n - Le nombre d'intervalles qui seront inclus dans la période, par exemple, 3 semaines précédentes;
  • part - Quel composant de l'objet tpr vous devez obtenir, par défaut all ;
  • week_start - L'argument est présent uniquement dans les fonctions de travail avec les semaines, et vous permet de spécifier le numéro du jour de la semaine qui sera considéré comme son début, par défaut le début de la semaine est le lundi, mais vous pouvez spécifier n'importe lequel de 1 - lundi à 7 - dimanche.

Ainsi, vous pouvez calculer n'importe quelle période par rapport à la date actuelle ou à toute autre date donnée, je vais donner quelques exemples supplémentaires:




 #  3   #  6  2019  #   -  last_n_weeks(x = "2019-10-06", n = 3, week_start = 1) 

  Time period: from 9 September of 2019, Monday to 29 September of 2019, Sunday 

Le 6 octobre est dimanche:
6 octobre 2019


Nous avons besoin d'une période qui, par rapport au 6 octobre, prendra 3 semaines précédentes. Non compris la semaine du 6 octobre. Il s'agit donc de la période du 9 au 29 septembre.


3 semaines à partir du 6 octobre 2019




 #     4  #  16  2019  previous_month(x = "2019-09-16", n = 4) 

  Time period: from 1 May of 2019, Wednesday to 31 May of 2019, Friday 

Dans cet exemple, nous sommes intéressés par le mois qui était il y a 4 mois, si nous procédons du 16 septembre 2019, en conséquence, c'était mai 2019.


Filtrage d'un vecteur de date avec timeperiodsR


Il existe plusieurs opérateurs pour filtrer les dates dans timeperiodsR :


  • % left_out% - compare deux objets de la classe tpr et renvoie la valeur de gauche, qui n'est pas à droite.
  • % left_in% - compare deux objets de la classe tpr et renvoie les dates de l'objet gauche qui sont incluses dans celle de droite.
  • % right_out% - compare deux objets de la classe tpr, et renvoie la valeur de droite, absente à gauche.
  • % right_in% - compare deux objets de la classe tpr et retourne les dates de l'objet droit présentes dans celui de gauche.

 period1 <- this_month("2019-11-07") period2 <- previous_week("2019-11-07") period1 %left_in% period2 #    period1    period2 period1 %left_out% period2 #    period1     period2 period1 %right_in% period2 #    period2    period1 period1 %right_out% period2 #    period2     period1 

Conclusion


Nous avons examiné en détail les classes d'objets conçues en langage R pour travailler avec des dates. Vous pouvez également maintenant effectuer des opérations arithmétiques sur des dates et obtenir rapidement toutes les périodes de temps en utilisant le package timeperiodsR .


Si vous êtes intéressé par la langue R, je vous invite à vous abonner à ma chaîne de télégramme R4marketing , dans laquelle je partage quotidiennement des documents utiles sur l'utilisation de la langue R pour résoudre mes tâches quotidiennes.

Source: https://habr.com/ru/post/fr469215/


All Articles