Bármely programozási nyelvben a jelenlegi dátum lekérése egy olyan művelet, ami egyenértékű a "Helló világ!"-al. Az R nyelv sem kivétel.
Ebben a cikkben megvizsgáljuk, hogyan működik a dátumkezelés az R nyelv alapvető szintaxisában, és több hasznos csomagot is bemutatunk, amelyek bővítik a dátumokkal végzett munkát:
lubridate— egy csomag, amely lehetővé teszi a dátumok közötti aritmetikai műveletek végrehajtását;timeperiodsR— egy csomag a időintervallumokkal és azok összetevőivel való munkához.

Tartalom
Ha érdekli az adatelemzés, és különösen az R nyelv, lehet, hogy érdekesnek találja az alábbiakat: és csatornáim. A tartalom nagy része az R nyelvnek szentelt.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Dátumkezelés az R alapvető szintaxisában
Szöveg dátummá alakítása
Alap R-ben található egy sor funkció a dátumok kezelésére. Az alap szintaxis hátránya, hogy a funkciók neve és argumentumainak nagy része nagyon szétszórt, és gyakorlatilag nincs logikai kapcsolat. Ennek ellenére fontos ismerni az alapvető nyelvi funkciókat, ezért pontosan ezekkel kezdjük.
Leggyakrabban, amikor adatokat tölt be az R-be CSV fájlokból vagy más forrásokból, a dátum szövegként jelenik meg. Ahhoz, hogy ezt a szöveget a megfelelő adattípusra alakítsa, használja a következő funkciót: 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"már tartalmaz egy előre létrehozott önaláírt TLS/SSL tanúsítványt. Ennyi nekem elegendő, mivel zárva tartom a külső hozzáférést. Azoknak, akik más típusú tanúsítványokat szeretnének használni, van as.Date() két formátumot fogad el: YYYY-HH-DD vagy YYYY/MM/DD.
Ha az adathalmazon a dátumok más formátumban vannak, a következő argumentumot használhatja a konvertáláshoz: format.
as.Date("2019. szeptember 26.", format = "%B %d, %Y")format ez a megadott időintervallum és annak formátumát jelölő sztringet fogad el. A leggyakrabban használt értékek az alábbi táblázatban találhatók:
Formátum
Leírás
%d
A nap száma a hónapban
%a
A hét napjának rövidítése
%A
A hét napjának teljes neve
%w
A hét napjának száma (0-6, ahol 0 a vasárnap)
%m
Kétszámjegyű hónapjelölés (01-12)
%b
A hónap rövidítése (ápr, márc, …)
%B
A hónap teljes neve
%y
Kétszámjegyű évjelölés
%Y
Négy számjegyű évjelölés
%j
A nap száma az évben (001 — 366)
%U
A hét sorszáma az évben (00 — 53), a hét első napja vasárnap
%W
Az év hétenkénti száma (00 — 53), a hét kezdete: hétfő
Ennek megfelelően, a "2019. szeptember 26." a hónap teljes megnevezése, a nap és az év. Ezt a dátumformát a következőképpen lehet leírni:"%B %d, %Y".
Ahol:
%B— A hónap teljes megnevezése%d— A nap száma a hónapban%Y— A négyjegyű évszám
A dátumformátum leírásánál fontos, hogy minden kiegészítő szimbólumot bele kell foglalni a szövegbe, például kötőjelet, vesszőt, pontokat, szóközöket és így tovább. Az én példámban, a "2019. szeptember 26." után van egy vessző, ezért a formátum leírásában is meg kell adni a vesszőt:"%B %d, %Y".
Vannak olyan helyzetek, amikor olyan dátumot kap, amely nem felel meg a szokásos formátumoknak (YYYY-MM-DD vagy YYYY/MM/DD), hanem egy olyan nyelven van, ami eltér az operációs rendszerében alapértelmezett nyelvtől. Például, ha olyan adatokat töltött fel, ahol a dátum így szerepel: "2019. december 15.". A szöveg dátummá való konvertálása előtt szükséges megváltoztatni a nyelvi beállításokat.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")Dátumkomponensek kinyerése alap R-ben
Az alap R-ben nem sok olyan funkció található, amely lehetővé teszi, hogy bármilyen részt kiemeljen a dátumból a Dátum.
current_date <- Sys.Date() # aktuális dátum
weekdays(current_date) # a hét napjának számát kapja
months(current_date) # a hónap számát kapja az évben
quarters(current_date) # a negyedév számát kapja az évbenA fő objektumosztály mellett Dátum az alap R-ben még 2 típusú adat létezik, amelyek tárolják az időbélyeget: POSIXlt, POSIXct. Ezen osztályok fő különbsége az, hogy az időt és a dátumot is tárolják. Dátum Sys.time()
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)# "POSIXct" "POSIXt"
Funkció a jelenlegi dátumot és időt adja vissza a formátumban . Ez a formátum lényegében hasonlít a POSIXctUNIXTIME , és tartalmazza a UNIX korszak kezdete óta eltelt másodpercek számát(az UTC szerint 1969. december 31. éjfél és 1970. január 1. között) továbbá tárolja az időt és a dátumot, és azok minden komponensét. Ezért egy bonyolultabb szerkezetű objektum, de bármely dátum- és időkomponens könnyen kinyerhető belőle, mivel gyakorlatilag.
Osztály POSIXlt A numerikus és szöveges adatok formátumokká való átalakítása POSIXlt ez 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* a következő funkciókkal történik as.POSIXct() as.POSIXlt() és . Ezeknek a funkcióknak egy kis argumentumkészlete van.x — Az a szám, szöveg vagy osztályobjektum,
- amelyet át kell alakítani; Dátumtz — Az időzóna, alapértelmezetten "GMT";
- format — A dátum formátumának leírása, amelyben az x argumentumba átadott adatok szerepelnek;
- format — A dátum formátumának leírása, amelyben az x argumentumba átadott adatok szerepelnek;
- origin — Csak a szám POSIX-ba alakításakor használható; ebben az argumentumban egy dátum- és időobjektumot kell megadni, amelyről a másodpercek számítása indul. Általában UNIXTIME-ból való átállításhoz használják.
Ha a dátum- és időadatok , és tartalmazza a UNIX korszak kezdete óta eltelt másodpercek számátformátumban állnak rendelkezésre, akkor az alábbi példa segítségével alakíthatók át érthető, olvasható dátummá:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")Az origin paraméterben bármilyen időbélyeget megadhat. Például, ha az adataiban a dátum és idő másodpercekben van megadva 2019. szeptember 15-étől 12:15-től, akkor a dátumba való átalakításhoz a következőt használja:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")Dátumok kezelése a lubridate csomaggal
lubridate talán a legnépszerűbb csomag az R nyelvben a dátumokkal való munkához. Továbbá három osztályt is biztosít.
- durations — a két időbélyeg között eltelt másodpercek, azaz a tartam;
- periods — az intervallumok lehetővé teszik az ember számára érthető időszakok, például napok, hónapok, hetek közötti számításokat;
- intervals — az időpont kezdő és záró pillanatait szolgáltató objektumok.
További csomagok telepítése R nyelven a standard függvénnyel történik, install.packages().
A csomag telepítése lubridate:
install.packages("lubridate")Szöveg dátummá alakítása a lubridate használatával
A csomag függvényei lubridate jelentősen leegyszerűsítik a szöveg dátummá alakításának folyamatát, valamint lehetővé teszik, hogy bármilyen aritmetikai műveletet végezzen a dátumokkal és időpontokkal.
A jelenlegi dátum, vagy a dátum és idő megszerzéséhez a következő függvények segítenek: today() és now().
today() # aktuális dátum
now() # aktuális dátum és időA string dátummá alakításához lubridate egészen a nevében mindig három betűt tartalmazó függvények családja áll rendelkezésre, amelyek a dátum komponenseinek sorrendjét jelzik:
- y — év
- m — hónap
- d — nap
A szöveg dátummá alakítására szolgáló függvények listája a lubridate csomagban
ymd()ydm()mdy()myd()dmy()dym()yq()
Néhány példa a stringek dátummá alakítására:
ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")Ahogy látja, lubridate jelentősen hatékonyabban képes a dátumok szövegszerű leírásának felismerésére, és lehetővé teszi, hogy a szöveget dátummá alakítsa anélkül, hogy további operátorokat használna a formátum leírásához.
Dátumkomponensek kinyerése a lubridate csomaggal
Továbbá, a segítségével lubridate bármely komponenst kinyerhet a dátumból:
dt <- ymd("2017 jan 21")
year(dt) # év
month(dt) # hónap
mday(dt) # nap a hónapban
yday(dt) # nap az évben
wday(dt) # hét napjaA dátumokkal végzett aritmetikai műveletek
De a legfontosabb és leglényegesebb funkció lubridate a dátumokkal történő különféle aritmetikai műveletek végrehajtásának lehetőségében rejlik.
A dátum kerekítése három funkcióval történik:
floor_date— az előző legközelebbi időpontra való kerekítésceiling_date— a következő legközelebbi időpontra való kerekítésround_date— az aktuális legközelebbi időpontra való kerekítés
Mindegyik funkciónak van egy argumentuma fájlt, amely a következő típusú:, ami lehetővé teszi, hogy megadja a kerekítési egységet: másodperc, perc, óra, nap, hét, hónap, két hónap, negyedév, évszak, félév, év
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # kerekítés hónapra
round_date(dt, unit = "3 month") # kerekítés 3 hónapra
round_date(dt, unit = "quarter") # kerekítés negyedévre
round_date(dt, unit = "season") # kerekítés évszakra
round_date(dt, unit = "halfyear") # kerekítés félévreTehát nézzük meg, hogyan kaphatjuk meg azt a dátumot, amely 8 nappal a jelenlegi dátum után lesz, és végezhetünk különböző matematikai számításokat két dátum között.
today() + days(8) # mi lesz a dátum 8 nap múlva
today() - months(2) # mi volt a dátum 2 hónappal ezelőtt
today() + weeks(12) # mi lesz a dátum 12 hét múlva
today() - years(2) # mi volt a dátum 2 évvel ezelőttEgyszerűsíti az időszakok kezelését, a timeperiodsR csomag.
timeperiodsR — egy új csomag a dátumok kezelésére, amelyet 2019 szeptemberében adtak ki a CRAN-on.
A csomag telepítése timeperiodsR:
install.packages("timeperiodsR")Fő célja, hogy gyorsan meghatározza egy adott dátumhoz viszonyított időintervallumot. Például a funkcióival könnyen lehet:
- Megkapni az előző hetet, hónapot, negyedévet vagy évet R-ben.
- Megkapni egy adott időintervallumot a dátumtól, például az előző 4 hetet.
- Könnyen kinyerhetjük az így kapott időintervallum összetevőit: a kezdő- és végdátumot, a periódusba eső napok számát, és az összes dátumot, ami benne van.
A csomag összes funkciójának neve timeperiodsR intuitívan érthető, és két részből áll: irány_az időintervallum, ahol:
- irány amelyben mozogni kell a megadott dátumhoz képest: last_n, previous, this, next, next_n.
- időbeli az időintervallum az időszak kiszámításához: nap, hét, hónap, negyedév, év.
A funkciók teljes készlete:
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()
Időintervallumok a timeperiodsR csomagban
Ezek a funkciók hasznosak, amikor jelentéseket kell készítenie az előző hét vagy hónap adatai alapján. Az előző hónap megkapásához használja az azonos nevű funkciót. previous_month():
prmonth <- previous_month()Ezután lesz egy objektuma prmonth kapcsolat és csatornák tpr, amelyből könnyen kinyerhetők a következő komponensek:
- a periódus kezdő dátuma, a mi példánkban ez az előző hónap
- a periódus végső dátuma
- a periódusban szereplő napok száma
- a periódus alatt található dátumok sorrendje
Ezenkívül minden komponens megkapható különböző módokon:
# первый день периода
prmonth$start
start(prmonth)
# последний день периода
prmonth$end
end(prmonth)
# последовательность дат
prmonth$sequence
seq(prmonth)
# количество дней входящих в период
prmonth$length
length(prmonth)A komponens bármelyikét kinyerheti az part, amely minden funkcióban megtalálható a csomagban. Lehetséges értékek: start, end, sequence, length.
previous_month(part = "start") # a periódus kezdete
previous_month(part = "end") # a periódus vége
previous_month(part = "sequence") # a dátumok sorrendje
previous_month(part = "length") # a periódus napjainak számaTehát nézzük meg az összes érvet, amelyek a csomag függvényeiben elérhetők timeperiodsR:
x— A referencia dátum, amelytől a periódus számolandó, alapértelmezés szerint a jelenlegi dátum;n— Az intervallumok száma, amelyek a periódusba fognak tartozni, például az előző 3 hét;part— Melyik komponensre van szükségtpralapértelmezés szerintmind;week_start— Ez az argumentum csak a hetek kezelésére szolgáló függvényekben található, és lehetővé teszi a hét napjának számának megadását, amely a hét elejének számít, alapértelmezés szerint a hétfő, de bármelyik megadható 1 - hétfő, 7 - vasárnap között.
Így bármilye időszakot kiszámíthat a jelenlegi, vagy bármely más megadott dátumhoz viszonyítva, íme még néhány példa:
# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06",
n = 3,
week_start = 1) Időszak: 2019. szeptember 9., hétfőtől 2019. szeptember 29., vasárnapigOktóber 6. vasárnap:

Olyan periódusra van szükségünk, amely október 6. viszonyítási ponttal az előző 3 hetet veszi figyelembe. Kivéve azt a hetet, amely magában foglalja október 6-át. Így a periódus szeptember 9-től 29-ig terjed.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Időszak: 2019. május 1., szerdától 2019. május 31., péntekigEbben a példában a hónap érdekel bennünket, amely négy hónappal ezelőtt volt, ha a 2019. szeptember 16-ot vesszük alapul, ez május 2019 volt.
Dátumvektor szűrése a timeperiodsR használatával
A dátumok szűréséhez a timeperiodsR több operátor áll rendelkezésre:
- %left_out% — összehasonlítja a két tpr osztályú objektumot, és visszaadja a bal oldali értéket, amely hiányzik a jobboldaliból.
- %left_in% — összehasonlítja a két tpr osztályú objektumot, és visszaadja a bal oldali objektumból azokat a dátumokat, amelyek a jobboldaliba tartoznak.
- %right_out% — összehasonlítja a két tpr osztályú objektumot, és visszaadja a jobb oldali értéket, amely hiányzik a bal oldaliból.
- %right_in% — összehasonlít két tpr osztályú objektumot, és visszaadja a jobb objektumból azokat a dátumokat, amelyek a bal oldalon is megtalálhatók.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
period1 %left_in% period2 # a period1-ből kinyerni azokat a dátumokat, amelyek a period2-ben vannak
period1 %left_out% period2 # a period1-ből kinyerni azokat a dátumokat, amelyek nincsenek a period2-ben
period1 %right_in% period2 # a period2-ből kinyerni azokat a dátumokat, amelyek a period1-ben vannak
period1 %right_out% period2 # a period2-ből kinyerni azokat a dátumokat, amelyek nincsenek a period1-benA csomag timeperiodsR rendelkezik hivatalos, orosz nyelvű .
Zárás
Részletesen megvizsgáltuk a dátumokkal való munkára szolgáló R nyelvi objektumok osztályait. Most már pedig képes vagy aritmetikai műveleteket végezni dátumokkal, és gyorsan bármilyen időszakot elérni a csomag segítségével. timeperiodsR.
Ha érdekel az R nyelv, meghívlak, hogy iratkozz fel a Telegram csatornámra. , ahol naponta hasznos anyagokat osztok meg az R nyelv alkalmazásáról a mindennapi feladataim megoldásában.
Forrás: habr.com
