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.

Dátumokkal való munka R-ben (alapképességek, valamint a lubridate és timeperiodsR csomagok)

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.

  1. Munka dátumokkal az alapvető R szintaxisban
    1.1. Konvertálja a szöveget dátummá
    1.2. Dátumkomponensek kibontása az alap R-ben
  2. Munka dátumokkal a kenőanyag csomag használatával
    2.1. Konvertálja a szöveget dátummá a lubridate segítségével
    2.2. Dátum komponensek kinyerése a kenőanyag csomag segítségével
    2.3. Aritmetikai műveletek dátumokkal
  3. Egyszerűsített munka időszakokkal, timeperiodsR csomaggal
    3.1. Időintervallumok időperiódusokbanR
    3.2. Dátumvektorok szűrése timeperiodsR használatával
  4. Következtetés

Munka dátumokkal az alapvető R szintaxisban

Konvertálja a szöveget dátummá

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:
Dátumokkal való munka R-ben (alapképességek, valamint a lubridate és timeperiodsR csomagok)

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.

Dátumokkal való munka R-ben (alapképességek, valamint a lubridate és timeperiodsR csomagok)

# получить месяц отстающий на 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

A csomagnál timeperiodsR van egy hivatalos, orosz nyelvű YouTube lejátszási lista.

Következtetés

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.

Forrás: will.com

Hozzászólás