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.

Obsah
Ak máte záujem o analýzu dát a konkrétne o jazyk R, mohli by vás zaujímať moje a kanály. Väčšina obsahu je zameraná na jazyk R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
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 rokuOkrem 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 časNa 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ýždniAritmetické 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ý časceiling_date— zaokrúhľovanie na najbližší budúci časround_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 polrokTakž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 rokmiZjednoduš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 objektutprpotrebujete získať, predvolenevš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ľa6. október je nedeľa:

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.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Časové obdobie: od 1. mája 2019, streda do 31. mája 2019, piatokV 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 period1O balíku timeperiodsR existuje oficiálny, slovensky hovoriaci .
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 , 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
