Obtenir la date actuelle dans n'importe quel langage de programmation est une opération équivalente à "Hello world!". Le langage R ne fait pas exception.
Dans cet article, nous allons examiner comment fonctionne la gestion des dates dans la syntaxe de base du langage R, ainsi que quelques paquets utiles qui étendent ses capacités de gestion des dates :
lubridate— un paquet permettant d'effectuer des calculs arithmétiques sur les dates ;timeperiodsR— un paquet pour travailler avec des intervalles de temps et leurs composants.

Contenu
Si vous vous intéressez à l'analyse de données, et en particulier au langage R, mes et chaînes pourraient vous intéresser. La majorité du contenu est consacré au langage R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Gestion des dates dans la syntaxe de base de R
Conversion de texte en date
Dans le R de base, il existe un ensemble de fonctions pour travailler avec les dates. Le inconvénient de la syntaxe de base est que la casse des noms et des arguments des fonctions est très disparate et n'a pratiquement aucune logique. Cela dit, il est essentiel de connaître les fonctions de base du langage, nous allons donc commencer avec elles.
Lors de l'importation de données dans R, à partir de fichiers csv ou d'autres sources, vous récupérez souvent la date sous forme de texte. Pour convertir ce texte au bon type de données, 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() qui accepte la date dans deux formats : AAAA-MM-JJ ou AAAA/MM/JJ.
Si vos données sont présentées dans un autre format, vous pouvez utiliser l'argument format.
as.Date("26 septembre 2019", format = "%B %d, %Y")format qui prend sous forme de chaîne les opérateurs représentant un intervalle de temps et son format, les valeurs les plus couramment utilisées sont listées dans le tableau ci-dessous :
Format
Description
%d
Numéro du jour dans le mois
%a
Abréviation du nom du jour de la semaine
%A
Nom complet du jour de la semaine
%w
Numéro du jour de la semaine (0-6, où 0 est dimanche)
%m
Code à deux chiffres du mois (01-12)
%b
Abréviation du nom du mois (avr, mar, …)
%B
Nom complet du mois
%y
Code à deux chiffres de l'année
%Y
Code à quatre chiffres de l'année
%j
Numéro du jour dans l'année (001 — 366)
%U
Numéro de la semaine dans l'année (00 — 53), début de la semaine Dimanche
%W
Numéro de la semaine dans l'année (00 — 53), début de la semaine Lundi
Ainsi, "26 septembre 2019" est — le nom complet du mois, le jour et l'année. Pour décrire ce format de date avec des opérateurs, on peut le faire comme suit :"%B %d, %Y".
Où :
%B— Nom complet du mois%d— Numéro du jour dans le mois%Y— Indication de l'année sur 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, par exemple les tirets, les virgules, les points, les espaces, etc. Dans mon exemple, "26 septembre 2019", après la date se trouve une virgule, et il faut également mettre une virgule dans la description du format :"%B %d, %Y".
Il existe des situations où vous recevez une date qui ne correspond pas aux formats standard (YYYY-MM-DD ou YYYY/MM/DD), mais aussi dans une langue différente de celle qui est par défaut dans votre système d'exploitation. Par exemple, vous avez téléchargé des données où la date est indiquée sous la forme suivante : "15 décembre 2019". Avant de convertir cette chaîne en date, vous devez changer la locale.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")Extraction des composants de date dans le R de base
Dans R de base, il n'y a pas beaucoup de fonctions permettant d'extraire une partie de la date à partir d'un objet de classe Date.
current_date <- Sys.Date() # date actuelle
weekdays(current_date) # obtenir le numéro du jour de la semaine
months(current_date) # obtenir le numéro du mois de l'année
quarters(current_date) # obtenir le numéro du trimestre de l'annéeEn plus de la classe principale d'objets Date dans R de base, il existe encore 2 types de données qui stockent des timestamps : POSIXlt, POSIXct. La principale différence entre ces classes est que, en plus de la date, elles stockent également l'heure. Date Sys.time()
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)# "POSIXct" "POSIXt"
Fonction renvoie la date et l'heure actuelles au format . Ce format est conceptuellement similaire à POSIXctUNIXTIME , 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) il stocke également l'heure et la date, ainsi que tous leurs composants. C'est donc un objet d'une structure plus complexe, mais dont il est facile d'obtenir n'importe quel composant de date et d'heure car, au fond,.
Classe POSIXlt La conversion de données numériques et textuelles en formats POSIXlt c'est list.
# Получаем текущую дату и время
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 # часовой поясPOSIX* s'effectue avec les fonctions as.POSIXct() as.POSIXlt() et . Ces fonctions ont un petit ensemble d'arguments.x — Nombre, chaîne ou objet de classe
- , qui doit être converti ; Datetz — Fuseau horaire, par défaut "GMT" ;
- format — Description du format de date dans lequel les données transmises à l'argument x sont présentées ;
- format — Description du format de la 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, cet argument doit recevoir un objet date et heure à partir duquel le décompte en secondes commence. Il est généralement utilisé pour traduire à partir du UNIXTIME.
Si vos données de date et heure sont présentées dans , et stocke le nombre de secondes depuis le début de l'ère UNIX, utilisez l'exemple suivant pour les convertir en une date compréhensible et lisible :
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")Dans origin, vous pouvez spécifier n'importe quel timestamp. Par exemple, si vos données indiquent la date et l'heure comme le nombre de secondes depuis le 15 septembre 2019 à 12h15, vous pouvez les convertir en date comme suit :
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")Gestion des dates avec le paquet lubridate
lubridate probablement le paquet le plus populaire pour travailler avec les dates en R. Il vous offre également trois classes supplémentaires.
- durations — la durée, c'est-à-dire le nombre de secondes entre deux timestamps ;
- periods — les périodes permettent de faire des calculs entre des dates avec des intervalles compréhensibles pour les humains : jours, mois, semaines, etc. ;
- intervals — objets fournissant le moment de départ et de fin.
L'installation de paquets supplémentaires dans le langage R se fait avec la fonction standard install.packages().
Installation du paquet lubridate:
install.packages("lubridate")Conversion de texte en date avec lubridate
Les fonctions du paquet lubridate simplifient considérablement le processus de conversion du texte en date et vous permettent également d'effectuer toutes sortes d'opérations arithmétiques avec les dates et heures.
Pour obtenir la date actuelle ou la date et l'heure, vous pouvez utiliser les fonctions today() et now().
today() # date actuelle
now() # date et heure actuellesPour convertir une chaîne en date dans lubridate il existe toute une famille de fonctions dont les noms se composent toujours de trois lettres, représentant la séquence des composants de la date :
- y — année
- m — mois
- d — jour
Liste des fonctions pour convertir du texte en date via lubridate
ymd()ydm()mdy()myd()dmy()dym()yq()
Quelques exemples pour convertir des chaînes en dates :
ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")Comme vous le voyez, lubridate il est considérablement plus efficace pour reconnaître les descriptions de dates 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.
Extraction des composants de dates avec le paquet lubridate
Avec lubridate vous pouvez également obtenir n'importe quel composant d'une date :
dt <- ymd("2017 jan 21")
year(dt) # année
month(dt) # mois
mday(dt) # jour dans le mois
yday(dt) # jour dans l'année
wday(dt) # jour de la semaineOpérations arithmétiques sur les dates
Mais la fonctionnalité la plus importante et essentielle lubridate réside dans la capacité d'effectuer diverses opérations arithmétiques avec les dates.
L'arrondi d'une date s'effectue par trois fonctions :
floor_date— arrondi à l'heure précédente la plus procheceiling_date— arrondi à l'heure suivante la plus procheround_date— arrondi à l'heure la plus proche
Chacune de ces fonctions a un argument unit, qui vous permet de spécifier l'unité d'arrondi : seconde, minute, heure, jour, semaine, mois, bimestre, trimestre, saison, semestre, année
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # arrondir au mois
round_date(dt, unit = "3 month") # arrondir à 3 mois
round_date(dt, unit = "quarter") # arrondir au trimestre
round_date(dt, unit = "season") # arrondir à la saison
round_date(dt, unit = "halfyear") # arrondir au semestreVoyons donc comment obtenir une date qui sera 8 jours après la date actuelle et effectuer diverses autres opérations arithmétiques entre deux dates.
today() + days(8) # quelle sera la date dans 8 jours
today() - months(2) # quelle date était il y a 2 mois
today() + weeks(12) # quelle date sera dans 12 semaines
today() - years(2) # quelle date était il y a 2 ansTravail simplifié avec des périodes, le paquet timeperiodsR.
timeperiodsR — un nouveau paquet pour travailler avec les dates qui a été publié sur CRAN en septembre 2019.
Installation du paquet timeperiodsR:
install.packages("timeperiodsR")L'objectif principal est de définir rapidement un certain intervalle de temps par rapport à une date donnée. Par exemple, grâce à ses fonctions, vous pouvez facilement :
- Obtenir la semaine, le mois, le trimestre ou l'année précédente en R.
- Obtenir un certain nombre de périodes par rapport à une date, par exemple les 4 dernières semaines.
- Extraire facilement les composants de l'intervalle temporel obtenu : la date de début et de fin, le nombre de jours compris dans l'intervalle, toute la séquence de dates qui y est incluse.
Le nom de toutes les fonctions du paquet timeperiodsR est intuitif et se compose de deux parties : direction_intervalle, où :
- direction dans lequel il faut se déplacer par rapport à la date donnée : last_n, previous, this, next, next_n.
- temporel intervalle pour calculer la période : jour, semaine, mois, trimestre, année.
Ensemble complet de fonctions :
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 dans timeperiodsR
Ces fonctions sont utiles dans les cas où vous devez construire des rapports basés sur les données de la semaine ou du mois précédent. Pour obtenir le mois précédent, utilisez la fonction éponyme previous_month():
prmonth <- previous_month()Après cela, vous aurez un objet prmonth classe tpr, à partir duquel vous pouvez facilement obtenir les composants suivants :
- la date de début de la période, dans notre exemple c'est le mois précédent
- la date de fin de la période
- le nombre de jours compris dans la période
- la séquence de dates comprise dans la période
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 en utilisant l'argument part, qui est présent dans chacune des fonctions du paquet. Valeurs possibles : start, end, sequence, length.
previous_month(part = "start") # début de la période
previous_month(part = "end") # fin de la période
previous_month(part = "sequence") # séquence de dates
previous_month(part = "length") # nombre de jours dans la périodeDonc, examinons tous les arguments disponibles dans les fonctions du paquet timeperiodsR:
x— Date de référence à partir de laquelle la période sera calculée, par défaut la date actuelle ;n— Nombre d'intervalles qui seront inclus dans la période, par exemple 3 semaines précédentes ;part— Quel composant de l'objettprvous devez obtenir, par défauttout;week_start— Cet argument n'est présent que dans les fonctions travaillant avec les semaines et permet de définir 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 définir n'importe lequel entre 1 — lundi et 7 — dimanche.
Ainsi, vous pouvez calculer n'importe quelle période temporelle 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) Période temporelle : du 9 septembre 2019, lundi au 29 septembre 2019, dimancheLe 6 octobre est un dimanche :

Nous avons besoin d'une période qui, par rapport au 6 octobre, prendra 3 semaines précédentes. Ne incluant pas la semaine qui contient le 6 octobre. Par conséquent, il s'agit de la période du 9 au 29 septembre.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Période temporelle : du 1er mai 2019, mercredi au 31 mai 2019, vendrediDans cet exemple, nous sommes intéressés par le mois qui était il y a 4 mois, en partant du 16 septembre 2019, donc c'était mai 2019.
Filtrage d'un vecteur de dates avec timeperiodsR
Pour filtrer les dates dans timeperiodsR il existe plusieurs opérateurs :
- %left_out% — compare deux objets de la classe tpr, et renvoie la valeur de gauche qui est absente à droite.
- %left_in% — compare deux objets de la classe tpr, et renvoie les dates de l'objet gauche qui sont incluses dans le droit.
- %right_out% — compare deux objets de la classe tpr, et renvoie la valeur de droite qui est absente à gauche.
- %right_in% — compare deux objets de la classe tpr et retourne les dates de l'objet de droite qui se trouvent dans l'objet de gauche.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
period1 %left_in% period2 # obtenir les dates de period1 qui sont dans period2
period1 %left_out% period2 # obtenir les dates de period1 qui ne sont pas dans period2
period1 %right_in% period2 # obtenir les dates de period2 qui sont dans period1
period1 %right_out% period2 # obtenir les dates de period2 qui ne sont pas dans period1Le package timeperiodsR a un canal officiel en russe .
Conclusion
Nous avons examiné en détail les classes d'objets destinées dans le langage R à travailler avec les dates. Vous savez maintenant effectuer des opérations arithmétiques sur les dates et obtenir rapidement n'importe quelle période temporelle grâce au package timeperiodsR.
Si vous êtes intéressé par le langage R, je vous invite à vous abonner à mon canal Telegram , où je partage quotidiennement des ressources utiles sur l'utilisation du langage R pour résoudre mes tâches quotidiennes.
Source : habr.com
