Práca s dátami v jazyku R (základné možnosti a balíky lubridate a timeperiodsR)

Získať aktuálny dátum v akomkoľvek programovacom jazyku je operácia ekvivalentná "Hello world!". Jazyk R nie je výnimkou.

V tomto článku sa pozrieme na to, ako funguje práca s dátumami v základnej syntaxi jazyka R, a tiež preskúmame niekoľko užitočných balíkov, ktoré rozširujú jeho možnosti pri práci s dátumami:

  • lubridate — balík umožňujúci vykonávať aritmetické výpočty medzi dátumami;
  • timeperiodsR — balík na prácu s časovými intervalmi a ich komponentami.

Práca s dátami v jazyku R (základné možnosti a balíky lubridate a timeperiodsR)

Obsah

Ak máte záujem o analýzu dát a konkrétne o jazyk R, mohli by vás zaujímať moje telegram a youtube kanály. Väčšina obsahu je zameraná na jazyk R.

  1. Práca s dátumami v základnej syntaxe R
    1.1. Prevod textu na dátum
    1.2. Extrahovanie komponentov dátumu v základnom R
  2. Práca s dátumami pomocou balíka lubridate
    2.1. Prevod textu na dátum pomocou lubridate
    2.2. Extrahovanie komponentov dátumov pomocou balíka lubridate
    2.3. Aritmetické operácie s dátumami
  3. Zjednodušená práca s obdobiami, balík timeperiodsR
    3.1. Časové intervaly v timeperiodsR
    3.2. Filtrovanie vektora dátumov pomocou timeperiodsR
  4. Záver

Práca s dátumami v základnej syntaxe R

Prevod textu na dátum

V základnom R je k dispozícii súbor funkcií na prácu s dátumami. Nevýhodou základnej syntaxy je, že registr názvov a argumentov funkcií je veľmi rozptýlený a takmer nemá logickú súvislosť. Napriek tomu, základné funkcie jazyka treba poznať, takže začneme práve od nich.

Najčastejšie pri nahrávaní dát do R, z csv súborov alebo iných zdrojov, dostávate dátum vo forme textu. Na to, aby ste tento text previedli na správny typ dát, použite funkciu 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"

Predvolene as.Date() prijíma dátum v dvoch formátoch: RRRR-MM-DD alebo RRRR/MM/DD.
Ak sú vo vašich dátach dátumy prezentované v inom formáte, môžete použiť argument format.

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

format prijíma v textovej forme operátory označujúce akýkoľvek časový interval a jeho formát, najčastejšie používané hodnoty sú uvedené v tabuľke nižšie:

Formát
Popis

%d
Číslo dňa v mesiaci

%a
Abbreviácia názvu dňa v týždni

%A
Plné názov dňa v týždni

%w
Číslo dňa v týždni (0-6, kde 0 je nedeľa)

%m
Dvojčíslové označenie mesiaca (01-12)

%b
Abbreviácia názvu mesiaca (apr, mar, …)

%B
Plné názov mesiaca

%y
Dvojčíslové označenie roka

%Y
Štvorčíslové označenie roka

%j
Číslo dňa v roku (001 — 366)

%U
Číslo týždňa v roku (00 — 53), začiatok týždňa Nedeľa

%W
Číslo týždňa v roku (00 — 53), začiatok týždňa Pondelok

Zodpovedajúco, "26. september 2019" je — úplný názov mesiaca, deň a rok. Tento formát dátumu možno opísať takto:"%B %d, %Y".

Kde:

  • %B — Úplný názov mesiaca
  • %d — Číslo dňa v mesiaci
  • %Y — Štvormiestne označenie roku

Pri opise formátu dátumu je dôležité zahrnúť všetky doplnkové znaky z vašej postupnosti, napríklad pomlčky, čiarky, bodky, medzery a tak ďalej. V mojom príklade, "26. september 2019", po dátume je čiarka, takže aj v opise formátu je potrebné pridať čiarku:"%B %d, %Y".

Môžu nastať situácie, keď dostanete dátum, ktorý nielen nevyhovuje štandardným formátom (RRRR-MM-DD alebo RRRR/MM/DD), ale aj v jazyku, ktorý sa líši od predvoleného nastavenia vo vašom operačnom systéme. Napríklad ste načítali údaje, kde je dátum uvedený v takomto formáte: "15. december 2019". Pred konverziou tejto postupnosti na dátum je potrebné zmeniť lokalitu.

# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")

Extrahovanie komponentov dátumu v základnom R

V základnom R nie je veľa funkcií, ktoré umožňujú extrahovať akúkoľvek časť dátumu z objektu triedy Date.

current_date <- Sys.Date() # aktuálny dátum
weekdays(current_date)     # získať číslo dňa v týždni
months(current_date)       # získať číslo mesiaca v roku
quarters(current_date)     # získať číslo kvartálu v roku

Okrem základnej triedy objektov Date v základnom R existujú ešte 2 typy dát, ktoré uchovávajú časové pečiatky: POSIXlt, POSIXct. Hlavný rozdiel týchto tried od Date spočíva v tom, že okrem dátumu uchovávajú aj čas.

# получить текущую дату и время
current_time <- Sys.time()

# узнать класс объекта current_time 
class(current_time)

# "POSIXct" "POSIXt"

Funkcia Sys.time() vracia aktuálny dátum a čas vo formáte POSIXct. Tento formát v podstate zodpovedá UNIXTIME, a uchováva počet sekúnd od začiatku UNIX éry (polnoc (UTC) z 31. decembra 1969 na 1. januára 1970).

Trieda POSIXlt takisto uchováva čas a dátum, a všetky ich komponenty. Preto je objektom s zložitejšou štruktúrou, z ktorého môžete ľahko získať akúkoľvek zložku dátumu a času, pretože v podstate POSIXlt to 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  # часовой пояс

Premena číselných a textových dát do formátov POSIX* vykonáva funkcie as.POSIXct() a as.POSIXlt(). Tieto funkcie majú malý súbor argumentov.

  • x — Číslo, reťazec alebo objekt triedy Date, ktorý je potrebné previesť;
  • tz — Časové pásmo, predvolene "GMT";
  • format — Opis formátu dátumu, v akom sú prezentované dáta predávané v argumente x;
  • origin — Používa sa iba pri konverzii čísla na POSIX, do tohto argumentu je potrebné zadať objekt dátumu a času, od ktorého sa odpočítavajú sekundy. Zvyčajne sa používa na prevod z UNIXTIME.

Ak sú vaše údaje o dátume a čase zobrazené v UNIXTIME, na ich konverziu na zrozumiteľný, čitateľný dátum použite nasledujúci príklad:

# Конвертируем UNIXTIME в читаемую дату 
as.POSIXlt(1570084639,  origin = "1970-01-01")

Do origin môžete zadať akúkoľvek časovú známku. Napríklad, ak sú vo vašich údajoch dátum a čas uvedené ako počet sekúnd od 15. septembra 2019 o 12:15, na ich prevod na dátum použite:

# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123,  origin = "2019-09-15 12:15:00")

Práca s dátumami pomocou balíka lubridate

lubridate snáď najpopulárnejší balík na prácu s dátumami v jazyku R. Poskytuje vám navyše tri ďalšie triedy.

  • durations — trvanie, t.j. počet sekúnd medzi dvoma časovými známkami;
  • periods — obdobia umožňujú vykonávať výpočty medzi dátumami zrozumiteľnými pre človeka intervalmi: dňami, mesiacmi, týždňami a podobne;
  • intervals — objekty poskytujúce počiatočný a konečný časový moment.

Inštalácia ďalších balíkov v jazyku R sa vykonáva pomocou štandardnej funkcie install.packages().

Inštalácia balíka lubridate:

install.packages("lubridate")

Prevod textu na dátum pomocou lubridate

Funkcie balíka lubridate výrazne zjednodušujú proces konverzie textu na dátum a tiež umožňujú vykonávať akékoľvek aritmetické operácie s dátumami a časom.

Získať aktuálny dátum alebo dátum a čas vám pomôžu funkcie today() a now().

today() # aktuálny dátum
now()   # aktuálny dátum a čas

Na prevod reťazca na dátum v lubridate existuje celá rodina funkcií, ktorých názvy pozostávajú vždy z troch písmen a označujú sekvenciu komponentov dátumu:

  • y — rok
  • m — mesiac
  • d — deň

Zoznam funkcií na konverziu textu na dátum pomocou lubridate

  • ymd()
  • ydm()
  • mdy()
  • myd()
  • dmy()
  • dym()
  • yq()

Niekoľko príkladov na konverziu reťazcov na dátumy:

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

Ako vidíte, lubridate výrazne efektívnejšie rozpoznáva opis dátumov vo forme textu a umožňuje vám prevádzať text na dátum bez použitia ďalších operátorov na opis formátu.

Extrahovanie komponentov dátumov pomocou balíka lubridate

Taktiež pomocou lubridate môžete získať akúkoľvek súčasť z dátumu:

dt <- ymd("2017 jan 21")

year(dt)  # rok
month(dt) # mesiac
mday(dt)  # deň v mesiaci
yday(dt)  # deň v roku
wday(dt)  # deň v týždni

Aritmetické operácie s dátumami

Ale najdôležitejšia a základná funkcia lubridate spočíva v možnosti vykonávať rôzne aritmetické operácie s dátumami.

Zaokrúhľovanie dátumu sa vykonáva tromi funkciami:

  • floor_date — zaokrúhľovanie na najbližší predošlý čas
  • ceiling_date — zaokrúhľovanie na najbližší budúci čas
  • round_date — zaokrúhľovanie na najbližší čas

Každá z týchto funkcií má argument unit, ktorý vám umožňuje uviesť jednotku zaokrúhľovania: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # zaokrúhliť na mesiac
round_date(dt, unit = "3 month")  # zaokrúhliť na 3 mesiace
round_date(dt, unit = "quarter")  # zaokrúhliť na kvartál
round_date(dt, unit = "season")   # zaokrúhliť na sezónu
round_date(dt, unit = "halfyear") # zaokrúhliť na polrok

Takže sa poďme pozrieť na to, ako získať dátum, ktorý bude 8 dní po aktuálnom dátume a vykonávať rôzne ďalšie aritmetické výpočty medzi dvoma dátumami.

today() + days(8)   # aký dátum bude 8 dní po
today() - months(2) # aký dátum bol pred 2 mesiacmi
today() + weeks(12) # aký dátum bude 12 týždňov po
today() - years(2)  # aký dátum bol pred 2 rokmi

Zjednodušená práca s obdobiami, balík timeperiodsR.

timeperiodsR — nový balík na prácu s dátumami, ktorý bol publikovaný na CRAN v septembri 2019.

Inštalácia balíka timeperiodsR:

install.packages("timeperiodsR")

Hlavným účelom je rýchle určenie určitého časového intervalu vzhľadom na zadaný dátum. Napríklad s jeho funkciami môžete jednoducho:

  • Získať minulý týždeň, mesiac, kvartál alebo rok v R.
  • Získať zadaný počet časových intervalov vzhľadom na dátum, napríklad predchádzajúce 4 týždne.
  • Jednoducho extrahovať z získaného časového intervalu jeho komponenty: počiatočný a konečný dátum, počet dní, ktoré spadajú do intervalu, celú posloupnosť dát, ktoré do neho patrí.

Názvy všetkých funkcií balíka timeperiodsR sú intuitívne a pozostávajú z dvoch častí: smer_interval, kde:

  • smer v ktorom je potrebné sa pohybovať vzhľadom na zadaný dátum: last_n, previous, this, next, next_n.
  • časový interval na výpočet obdobia: day, week, month, quarter, year.

Celá súprava funkcií:

  • 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()

Časové intervaly v timeperiodsR

Tieto funkcie sú užitočné v prípadoch, keď potrebujete vytvárať správy na základe dát za minulý týždeň alebo mesiac. Ak chcete získať minulý mesiac, použite rovnomennú funkciu previous_month():

prmonth <- previous_month()

Po čom máte objekt prmonth triedy tpr, z ktorého sa ľahko dajú získať nasledujúce komponenty:

  • dátum začiatku obdobia, v našom príklade to je minulý mesiac
  • dátum ukončenia obdobia
  • počet dní zahŕňajúcich obdobie
  • posloupnosť dát zahŕňajúcich obdobie

A každý z komponentov je možné získať rôznymi spôsobmi:

# первый день периода
prmonth$start
start(prmonth)

# последний день периода
prmonth$end
end(prmonth)

# последовательность дат
prmonth$sequence
seq(prmonth)

# количество дней входящих в период
prmonth$length
length(prmonth)

Môžete tiež získať ktorýkoľvek z komponentov pomocou argumentu part, ktorý je prítomný v každej funkcii balíka. Možné hodnoty: start, end, sequence, length.

previous_month(part = "start")    # začiatok obdobia
previous_month(part = "end")      # koniec obdobia
previous_month(part = "sequence") # posloupnosť dát
previous_month(part = "length")   # počet dní v období

Tak sa pozrime na všetky argumenty dostupné vo funkciách balíka timeperiodsR:

  • x — Referenčný dátum, od ktorého sa bude vypočítavať časové obdobie, predvolene aktuálny dátum;
  • n — Počet intervalov, ktoré budú zahrnuté do obdobia, napríklad 3 predchádzajúce týždne;
  • part — Ktorý komponent objektu tpr potrebujete získať, predvolene všetko;
  • week_start — Argument prítomný iba vo funkciách pre prácu s týždňami a umožňuje určiť číslo dňa v týždni, ktorý sa bude považovať za jeho začiatok, predvolene je začiatkom týždňa pondelok, ale môžete si nastaviť ktorýkoľvek od 1 — pondelok po 7 — nedeľa.

Týmto spôsobom môžete vypočítavať akékoľvek časové obdobie vo vzťahu k aktuálnemu alebo akémukoľvek inému určenému dátumu, uvediem ešte niekoľko príkladov:

# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06", 
             n = 3, 
             week_start = 1)

 Časové obdobie: od 9. septembra 2019, pondelok do 29. septembra 2019, nedeľa

6. október je nedeľa:
Práca s dátami v jazyku R (základné možnosti a balíky lubridate a timeperiodsR)

Potrebujeme obdobie, ktoré vo vzťahu k 6. októbru vezme 3 predchádzajúce týždne. Nezahŕňajúc týždeň, do ktorého patrí samotný 6. október. Zodpovedajúce obdobie je teda od 9. do 29. septembra.

Práca s dátami v jazyku R (základné možnosti a balíky lubridate a timeperiodsR)

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4)

 Časové obdobie: od 1. mája 2019, streda do 31. mája 2019, piatok

V tomto príklade nás zaujíma mesiac, ktorý bol pred 4 mesiacmi, ak vychádzame z 16. septembra 2019, to bol máj 2019.

Filtrovanie vektora dátumov pomocou timeperiodsR

Na filtrovanie dát v timeperiodsR existuje niekoľko operátorov:

  • %left_out% — porovnáva dva objekty triedy tpr a vracia hodnoty zľava, ktoré sa nenachádzajú vpravo.
  • %left_in% — porovnáva dva objekty triedy tpr a vracia dátumy z ľavého objektu, ktoré sú vpravo.
  • %right_out% — porovnáva dva objekty triedy tpr a vracia hodnoty zprava, ktoré sa nenachádzajú vľavo.
  • %right_in% — porovnáva dva objekty triedy tpr a vracia dátumy z pravého objektu, ktoré sa nachádzajú v ľavom.

period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")

period1 %left_in% period2   # získať dátumy z period1, ktoré sú v period2
period1 %left_out% period2  # získať dátumy z period1, ktoré nie sú v period2
period1 %right_in% period2  # získať dátumy z period2, ktoré sú v period1
period1 %right_out% period2 # získať dátumy z period2, ktoré nie sú v period1

O balíku timeperiodsR existuje oficiálny, slovensky hovoriaci playlist na YouTube.

Záver

Podrobne sme preskúmali triedy objektov, ktoré sú určené v jazyku R na prácu s dátumami. Taktiež teraz viete vykonávať aritmetické operácie nad dátumami a rýchlo získavať akékoľvek časové obdobia pomocou balíka timeperiodsR.

Ak vás zaujíma jazyk R, pozývam vás prihlásiť sa na môj telegramový kanál R4marketing, kde denne zdieľam užitočné materiály o použití jazyka R pri riešení svojich každodenných úloh.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster