ProHoster > Blog > Adminisztráció > Dátumokkal való munka R-ben (alapképességek, valamint a lubridate és timeperiodsR csomagok)
Dátumokkal való munka R-ben (alapképességek, valamint a lubridate és timeperiodsR csomagok)
Bármely programozási nyelven lekérheti az aktuális dátumot, ez a művelet egyenértékű a "Hello world!" Az R nyelv sem kivétel.
Ebben a cikkben megvizsgáljuk, hogyan működik a dátumokkal való munka az R nyelv alapszintaxisában, és számos hasznos csomagot is megvizsgálunk, amelyek bővítik a dátumokkal való munkavégzés lehetőségeit:
lubridate — egy csomag, amely lehetővé teszi számtani számítások elvégzését a dátumok között;
timeperiodsR — egy csomag az időintervallumokkal és azok összetevőivel való munkavégzéshez.
Tartalom
Ha érdekli az adatelemzés, és különösen az R nyelv, akkor érdekelheti az én távirat и youtube csatornák. A tartalom nagy része az R nyelvnek szól.
A Basic R számos funkcióval rendelkezik a dátumokkal való munkavégzéshez. Az alapszintaxis hátránya, hogy a függvénynevek és argumentumok esete nagyon szétszórt, és gyakorlatilag nincs logikai kapcsolata. A nyelv alapvető funkcióit azonban ismerni kell, ezért kezdjük velük.
Leggyakrabban, amikor adatokat tölt be az R-be, csv fájlokból vagy más forrásokból, szövegként kap dátumot. Ennek a szövegnek a megfelelő adattípusra konvertálásához használja a függvényt 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"
Alapértelmezésben as.Date() két formátumban fogadja el a dátumot: ÉÉÉÉ-HH-NN vagy ÉÉÉÉ/HH/NN.
Ha az adatkészlet más formátumú dátumokat tartalmaz, használhatja az argumentumot format.
as.Date("September 26, 2019", format = "%B %d, %Y")
formátum karakterlánc formájú operátorokat fogad el, amelyek bármilyen időintervallumot és annak formátumát jelölik; a leggyakrabban használt értékeket az alábbi táblázat mutatja:
formátum
Leírás
%d
Nap száma hónapban
%a
A hét napja nevének 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étjegyű hónap megjelölés (01-12)
%b
A hónap nevének rövidítése (ápr, márc, …)
%B
Teljes hónap neve
%y
Kétjegyű évjelölés
%Y
Négy számjegyű évszám
%j
Az év napjának száma (001 - 366)
%U
A hét száma az évben (00 - 53), a hét eleje vasárnap
%W
Az év hét száma (00 - 53), hét eleje hétfő
Ennek megfelelően a „26. szeptember 2019.” a hónap, a dátum és az év teljes neve. Ez a dátumformátum a következő operátorokkal írható le:"%B %d, %Y".
Hol:
%B — A hónap teljes neve
%d — A hónap napjának száma
%Y — Négy számjegyű évszám
A dátumformátum leírásakor fontos, hogy a karakterláncból minden további karaktert, például kötőjeleket, vesszőket, pontokat, szóközöket és így tovább szerepeljen. Az én példámban (26. szeptember 2019.) vessző van a dátum után, és a formátum leírásába is vesszőt kell tenni:"%B %d, %Y".
Vannak helyzetek, amikor olyan dátumot kap, amely nemcsak nem felel meg a szabványos formátumoknak (ÉÉÉÉ-HH-NN vagy ÉÉÉÉ/HH/NN), hanem olyan nyelven is, amely eltér az operációs rendszerére telepített alapértelmezett nyelvtől. Például olyan adatokat töltött le, amelyeknél a dátum így van feltüntetve: „15. december 2019.”. Mielőtt ezt a karakterláncot dátummá alakítaná, módosítania kell a területi beállítást.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")
Dátumkomponensek kibontása az alap R-ben
Az alap R-ben nem sok olyan függvény található, amely lehetővé teszi a dátum bármely részének kinyerését egy osztályobjektumból találka.
current_date <- Sys.Date() # текущая дата
weekdays(current_date) # получить номер дня недели
months(current_date) # получить номер месяца в году
quarters(current_date) # получить номер квартала в году
A fő objektumosztályon kívül találka az alap R-ben további 2 adattípus tárolja az időbélyeget: POSIXlt, POSIXct. A fő különbség ezen osztályok között és találka az, hogy a dátum mellett tárolják az időt.
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)
# "POSIXct" "POSIXt"
Funkció Sys.time() formátumban adja vissza az aktuális dátumot és időt POSIXct. Ez a formátum jelentésében hasonló a UNIXTIME, és tárolja a UNIX korszak kezdete óta eltelt másodpercek számát (éjfél (UTC) 31. december 1969. és 1. január 1970. között).
Osztály POSIXlt tárolja az időt és a dátumot, valamint ezek összes összetevőjét. Ezért egy bonyolultabb felépítésű objektumról van szó, amelyből könnyen beszerezhető bármilyen dátum és idő komponens, mert valójában POSIXlt ezt lista.
# Получаем текущую дату и время
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 # часовой пояс
Numerikus és szöveges adatok formátumba konvertálása POSIX* funkciók hajtják végre as.POSIXct() и as.POSIXlt(). Ezek a függvények egy kis argumentumkészlettel rendelkeznek.
x – Szám, karakterlánc vagy osztály objektum találka, amelyet át kell alakítani;
tz — Időzóna, alapértelmezett "GMT";
format — Annak a dátumformátumnak a leírása, amelyben az x argumentumnak átadott adatok jelennek meg;
eredet — Csak egy szám POSIX-re konvertálásakor használatos; át kell adnia egy dátumobjektumot és időpontot, amelytől kezdve a másodpercek számítanak ennek az argumentumnak. Általában UNIXTIME-ból történő fordításhoz használják.
Ha a dátum és idő információi benne vannak UNIXTIME, majd a következő példával konvertálja őket egyértelmű, olvasható dátummá:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")
Az eredetben bármilyen időbélyeget megadhat. Ha például az adatok a dátumot és az időt tartalmazzák a másodpercek számaként 15. szeptember 2019. 12:15 óta, akkor dátummá konvertálásához használja a következőket:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")
Munka dátumokkal a kenőanyag csomag használatával
lubridate Talán a legnépszerűbb csomag az R nyelvű dátumokkal való munkavégzéshez. Három további osztályt biztosít.
időtartamok — időtartam, i.e. másodpercek száma két időbélyeg között;
periódusok – az időszakok lehetővé teszik a dátumok közötti számításokat ember által olvasható időközönként: napok, hónapok, hetek stb.;
intervallumok - olyan objektumok, amelyek a kezdő és a végpontot biztosítják az időben.
A kiegészítő csomagok R nyelvű telepítése a szabványos funkció használatával történik install.packages().
A csomag telepítése lubridate:
install.packages("lubridate")
Konvertálja a szöveget dátummá a lubridate segítségével
A csomag jellemzői lubridate jelentősen leegyszerűsíti a szöveg dátummá alakításának folyamatát, és lehetővé teszi bármilyen aritmetikai művelet elvégzését dátumokkal és időpontokkal.
A funkciók segítségével megtalálhatja az aktuális dátumot vagy dátumot és időt today() и now().
today() # текущая дата
now() # текущая дата и время
Karakterlánc átalakítása dátummá lubridate A függvények egész családja létezik, amelyek neve mindig három betűből áll, és jelzi a dátumösszetevők sorrendjét:
y - év
m - hónap
d - nap
A szöveget dátummá konvertáló funkciók listája a lubridate segítségével
ymd()
ydm()
mdy()
myd()
dmy()
dym()
yq()
Néhány példa a karakterláncok dátummá konvertálására:
ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")
Amint látod lubridate Sokkal hatékonyabb a dátumleírások szövegként való felismerésében, és lehetővé teszi a szöveg dátummá alakítását anélkül, hogy további operátorokat használna a formátum leírására.
Dátum komponensek kinyerése a kenőanyag csomag segítségével
Használata is lubridate bármelyik komponenst beszerezheti egy dátumtól:
dt <- ymd("2017 jan 21")
year(dt) # год
month(dt) # месяц
mday(dt) # день в месяце
yday(dt) # день в году
wday(dt) # день недели
Aritmetikai műveletek dátumokkal
De a legfontosabb és alapvető funkció lubridate a különböző számtani műveletek dátumokkal való végrehajtásának képessége.
A dátum kerekítését három funkció hajtja végre:
floor_date — kerekítés a legközelebbi múlt időre
ceiling_date — kerekítés közeljövő idejére
round_date - kerekítés a legközelebbi időpontra
Mindegyik függvénynek van argumentuma egységamely lehetővé teszi a kerekítés mértékegységének megadását: másodperc, perc, óra, nap, hét, hónap, két hónap, negyed, évszak, félév, év
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") # округлить до полугодия
Találjuk ki tehát, hogyan kaphatunk olyan dátumot, amely 8 nappal az aktuális dátum után van, és végezzünk el különféle egyéb számtani számításokat a két dátum között.
today() + days(8) # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2) # какая дата была 2 года назад
Egyszerűsített munka időszakokkal, timeperiodsR csomaggal.
timeperiodsR — egy új csomag a dátumokkal való munkavégzéshez, amely 2019 szeptemberében jelent meg a CRAN-on.
A csomag telepítése timeperiodsR:
install.packages("timeperiodsR")
A fő cél egy bizonyos időintervallum gyors meghatározása egy adott dátumhoz képest. Funkcióinak használatával például egyszerűen:
Olvassa el az elmúlt hetet, hónapot, negyedévet vagy évet R-ben.
Adott számú időintervallumot kaphat egy dátumhoz képest, például az elmúlt 4 hétben.
A kapott időintervallumból könnyen kinyerhető összetevői: a kezdési és befejezési dátum, az intervallumban szereplő napok száma, a benne szereplő dátumok teljes sorozata.
Az összes csomagfüggvény neve timeperiodsR intuitívak és két részből állnak: irány_intervallum, ahol:
irány amelyben egy adott dátumhoz képest kell mozogni: utolsó_n, előző, ez, következő, következő_n.
időbeli intervallum az időszak kiszámításához: nap, hét, hónap, negyedév, év.
Teljes funkciókészlet:
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 időperiódusokbanR
Ezek a funkciók olyan esetekben hasznosak, amikor jelentéseket kell készítenie az elmúlt hét vagy hónap adatai alapján. Az utolsó hónap megtekintéséhez használja az azonos nevű függvényt previous_month():
prmonth <- previous_month()
Utána lesz egy tárgya prmonth класса tpr, amelyből a következő összetevők könnyen beszerezhetők:
az időszak kezdő dátuma, példánkban ez az utolsó hónap
időszak záró dátuma
az időszakba beleszámított napok száma
időszakba foglalt dátumok sorrendje
Ezenkívül az egyes összetevőket különböző módon szerezheti be:
# первый день периода
prmonth$start
start(prmonth)
# последний день периода
prmonth$end
end(prmonth)
# последовательность дат
prmonth$sequence
seq(prmonth)
# количество дней входящих в период
prmonth$length
length(prmonth)
Az argumentum használatával bármelyik összetevőt megkaphatja rész, amely a csomag minden egyes funkciójában megtalálható. Lehetséges értékek: kezdet, vége, sorrend, hossza.
previous_month(part = "start") # начало периода
previous_month(part = "end") # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length") # количество дней в периоде
Tehát nézzük meg a csomagfüggvényekben elérhető összes argumentumot timeperiodsR:
x — A referenciadátum, amelytől kezdve az időszakot számítják, alapértelmezés szerint az aktuális dátum;
n — Az időszakok száma, amelyek beletartoznak az időszakba, például az előző 3 hét;
part — Az objektum melyik összetevője tpr alapértelmezés szerint meg kell szereznie all;
week_start — Az argumentum csak a hetekkel való munkavégzés függvényében van jelen, és lehetővé teszi, hogy beállítsa a hét azon napjának számát, amely a hét kezdetének tekintendő. 1-től hétfőtől 7-ig - vasárnap.
Így bármilyen időszakot kiszámíthat az aktuális vagy bármely más dátumhoz képest; íme néhány további példa:
# получить 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
Október 6. vasárnap:
Szükségünk van egy olyan időszakra, amely október 6-hoz képest az előző 3 hetet veszi igénybe. Nem számítva azt a hetet, amely magában foglalja magát az október 6-át. Ennek megfelelően ez a szeptember 9-től szeptember 29-ig tartó időszak.
# получить месяц отстающий на 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
Ebben a példában a 4 hónappal ezelőtti hónapra vagyunk kíváncsiak, ha 16. szeptember 2019-tól indulunk, akkor 2019. május volt.
Dátumvektorok szűrése timeperiodsR használatával
A dátumok szűréséhez timeperiodsR Számos operátor létezik:
%left_out% - összehasonlít két tpr osztályú objektumot, és visszaadja a bal oldali értéket, amely a jobb oldaliból hiányzik.
%left_in% - összehasonlítja a tpr osztály két objektumát, és visszaadja a bal oldali objektum dátumait, amelyek a jobb oldali objektumban szerepelnek.
%right_out% - összehasonlít két tpr osztály objektumot, és visszaadja a jobb oldali értéket, amely hiányzik a balról.
%right_in% - összehasonlítja a tpr osztály két objektumát, és a jobb oldali objektumtól származó dátumokat adja vissza, amelyek a bal oldalon találhatók.
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
Részletesen megvizsgáltuk azokat az objektumosztályokat, amelyeket R nyelven terveztek a dátumokkal való munkavégzéshez. Mostantól számtani műveleteket is végrehajthat a dátumokon, és gyorsan lekérhet bármilyen időtartamot a csomag segítségével timeperiodsR.
Ha érdekli az R nyelv, kérem, iratkozzon fel a távirati csatornámra R4marketing, amelyben napi rendszerességgel osztok meg hasznos anyagokat az R nyelv használatáról napi problémái megoldásában.