Práca s dátumami v R (základné možnosti, ako aj balíčky lubridate a timeperiodsR)

Získajte aktuálny dátum v akomkoľvek programovacom jazyku, čo je operácia ekvivalentná "Ahoj svet!" 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ž sa pozrieme na niekoľko užitočných balíkov, ktoré rozširujú jej možnosti pri práci s dátumami:

  • lubridate — balík, ktorý vám umožňuje vykonávať aritmetické výpočty medzi dátumami;
  • timeperiodsR — balík na prácu s časovými intervalmi a ich komponentmi.

Práca s dátumami v R (základné možnosti, ako aj balíčky lubridate a timeperiodsR)

Obsah

Ak máte záujem o analýzu údajov a najmä o jazyk R, možno vás bude zaujímať môj telegram и youtube kanálov. Väčšina obsahu je venovaná jazyku R.

  1. Práca s dátumami v základnej syntaxi R
    1.1. Previesť text na dátum
    1.2. Zložky dátumu extrakcie v základnom R
  2. Práca s dátumami pomocou lubridačného balenia
    2.1. Preveďte text na dátum pomocou lubridátu
    2.2. Extrakcia dátumových komponentov pomocou lubridačného balenia
    2.3. Aritmetické operácie s dátumami
  3. Zjednodušená práca s obdobiami, balík timeperiodsR
    3.1. Časové intervaly v časových obdobiachR
    3.2. Filtrovanie vektora dátumov pomocou časových obdobíR
  4. Záver

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

Previesť text na dátum

Basic R má sadu funkcií pre prácu s dátumami. Nevýhodou základnej syntaxe je, že prípad názvov funkcií a argumentov je veľmi rozptýlený a nemá prakticky žiadnu logickú súvislosť. Musíte však poznať základné funkcie jazyka, preto začneme nimi.

Najčastejšie pri načítavaní údajov do R, zo súborov csv alebo iných zdrojov, dostanete dátum ako text. Ak chcete previesť tento text na správny typ údajov, 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"

V predvolenom nastavení as.Date() prijíma dátum v dvoch formátoch: RRRR-MM-DD alebo RRRR/MM/DD.
Ak vaša množina údajov obsahuje dátumy v inom formáte, môžete použiť argument format.

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

formát akceptuje operátory vo forme reťazca označujúce ľubovoľný č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
Skratka pre názov dňa v týždni

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

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

%m
Dvojmiestne označenie mesiaca (01-12)

%b
Skratka názvu mesiaca (apr, mar, ...)

%B
Názov celého mesiaca

%y
Dvojmiestne označenie roku

%Y
Štvormiestne označenie roku

%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

Preto je „26. september 2019“ úplný názov mesiaca, dátumu a roku. Tento formát dátumu možno opísať pomocou operátorov takto:"%B %d, %Y".

Kde:

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

Pri popisovaní formátu dátumu je dôležité zahrnúť všetky ďalšie znaky z vášho reťazca, ako sú pomlčky, čiarky, bodky, medzery atď. V mojom príklade „26. september 2019“ je za dátumom čiarka a čiarku musíte vložiť aj do popisu formátu:"%B %d, %Y".

Sú situácie, keď dostanete dátum, ktorý nielenže nezodpovedá štandardným formátom (RRRR-MM-DD alebo RRRR/MM/DD), ale aj v jazyku, ktorý sa líši od predvoleného jazyka nainštalovaného vo vašom operačnom systéme. Napríklad ste si stiahli údaje s dátumom uvedeným takto: „15. december 2019“. Pred konverziou tohto reťazca na dátum musíte zmeniť miestne nastavenie.

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

Zložky dátumu extrakcie v základnom R

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

current_date <- Sys.Date() # текущая дата
weekdays(current_date)     # получить номер дня недели
months(current_date)       # получить номер месяца в году
quarters(current_date)     # получить номер квартала в году

Okrem hlavnej triedy objektov dátum v základnom R existujú 2 ďalšie typy údajov, ktoré ukladajú časovú pečiatku: POSIXlt, POSIXct. Hlavný rozdiel medzi týmito triedami a dátum je, že okrem dátumu ukladajú aj čas.

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

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

# "POSIXct" "POSIXt"

Funkcia Sys.time() vráti aktuálny dátum a čas vo formáte POSIXct. Tento formát má podobný význam ako UNIXTIMEa ukladá počet sekúnd od začiatku éry UNIX (polnoc (UTC) z 31. decembra 1969 do 1. januára 1970).

Trieda POSIXlt ukladá tiež čas a dátum a všetky ich súčasti. Ide teda o objekt so zložitejšou štruktúrou, z ktorého je však ľahké získať akúkoľvek zložku dátumu a času, pretože v skutočnosti POSIXlt это zoznam.

# Получаем текущую дату и время
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  # часовой пояс

Konverzia číselných a textových údajov do formátov POSIX* vykonávané funkciami as.POSIXct() и as.POSIXlt(). Tieto funkcie majú malú množinu argumentov.

  • x — Číslo, reťazec alebo objekt triedy dátum, ktorý je potrebné previesť;
  • tz — Časové pásmo, predvolené „GMT“;
  • format — Popis formátu dátumu, v ktorom sú zastúpené údaje odovzdané argumentu x;
  • origin — Používa sa len pri prevode čísla na POSIX; do tohto argumentu musíte zadať objekt dátumu a čas, od ktorého sa sekundy počítajú. Zvyčajne sa používa na preklad z UNIXTIME.

Ak sú informácie o vašom dátume a čase v UNIXTIMEa potom ich previesť na jasný a čitateľný dátum, použite nasledujúci príklad:

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

V počiatku môžete zadať ľubovoľnú časovú pečiatku. Ak napríklad vaše údaje obsahujú dátum a čas ako počet sekúnd od 15. septembra 2019 12:15, potom na konverziu 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 lubridačného balenia

lubridate Snáď najobľúbenejší balík na prácu s dátumami v jazyku R. Poskytuje vám tri ďalšie triedy.

  • trvanie — trvanie, t.j. počet sekúnd medzi dvoma časovými značkami;
  • obdobia - obdobia umožňujú vykonávať výpočty medzi dátumami v intervaloch čitateľných pre človeka: dni, mesiace, týždne atď.;
  • intervaly - objekty, ktoré poskytujú počiatočný a konečný bod v čase.

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")

Preveďte text na dátum pomocou lubridátu

Vlastnosti balíka lubridate výrazne zjednodušiť proces prevodu textu na dátum a tiež vám umožní vykonávať akékoľvek aritmetické operácie s dátumami a časmi.

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

today() # текущая дата
now()   # текущая дата и время

Ak chcete previesť reťazec na dátum v lubridate Existuje celá rodina funkcií, ktorých názvy sa vždy skladajú z troch písmen a označujú postupnosť komponentov dátumu:

  • r - rok
  • m - mesiac
  • d - deň

Zoznam funkcií na konverziu textu na dátum cez mazanie

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

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

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

Ako môžeš vidieť lubridate Je oveľa efektívnejší pri rozpoznávaní popisu dátumu ako textu a umožňuje vám previesť text na dátum bez použitia ďalších operátorov na popis formátu.

Extrakcia dátumových komponentov pomocou lubridačného balenia

Tiež pomocou lubridate môžete získať akýkoľvek komponent od dátumu:

dt <- ymd("2017 jan 21")

year(dt)  # год
month(dt) # месяц
mday(dt)  # день в месяце
yday(dt)  # день в году
wday(dt)  # день недели

Aritmetické operácie s dátumami

Ale najdôležitejšia a základná funkcia lubridate je schopnosť vykonávať rôzne aritmetické operácie s dátumami.

Zaokrúhľovanie dátumu vykonávajú tri funkcie:

  • floor_date — zaokrúhľovanie na najbližší minulý čas
  • ceiling_date — zaokrúhľovanie do najbližšieho budúceho času
  • round_date - zaokrúhľovanie na najbližší čas

Každá z týchto funkcií má argument jednotkaktorá umožňuje určiť jednotku zaokrúhľovania: sekunda, minúta, hodina, deň, týždeň, mesiac, dva mesiace, štvrťrok, sezóna, polrok, ​​rok

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") # округлить до полугодия

Poďme teda zistiť, ako získať dátum, ktorý je 8 dní po aktuálnom dátume, a urobiť rôzne ďalšie aritmetické výpočty medzi týmito dvoma dátumami.

today() + days(8)   # какая дата будет через 8 дней
today() - months(2) # какая дата была 2 месяца назад
today() + weeks(12) # какая дата будет через 12 недель
today() - years(2)  # какая дата была 2 года назад

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

timeperiodsR — nový balík na prácu s dátumami, ktorý bol zverejnený 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 daný dátum. Pomocou jeho funkcií môžete napríklad jednoducho:

  • Získajte posledný týždeň, mesiac, štvrťrok alebo rok v R.
  • Získajte zadaný počet časových intervalov vzhľadom na dátum, napríklad posledné 4 týždne.
  • Z výsledného časového intervalu je ľahké extrahovať jeho zložky: dátum začiatku a konca, počet dní zahrnutých v intervale, celú postupnosť dátumov, ktoré sú v ňom zahrnuté.

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

  • smer v ktorom sa musíte posunúť relatívne k danému dátumu: last_n, previous, this, next, next_n.
  • dočasný interval na výpočet obdobia: deň, týždeň, mesiac, štvrťrok, rok.

Kompletná sada 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 časových obdobiachR

Tieto funkcie sú užitočné v prípadoch, keď potrebujete zostaviť prehľady na základe údajov za posledný týždeň alebo mesiac. Ak chcete získať posledný mesiac, použite funkciu s rovnakým názvom previous_month():

prmonth <- previous_month()

Potom budete mať objekt prmesiac trieda TPR, z ktorého možno ľahko získať nasledujúce komponenty:

  • dátum začiatku obdobia, v našom príklade je to posledný mesiac
  • dátum ukončenia obdobia
  • počet dní zahrnutých do obdobia
  • poradie dátumov zahrnutých do obdobia

Okrem toho môžete každý z komponentov získať rôznymi spôsobmi:

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

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

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

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

Ktorýkoľvek z komponentov môžete získať aj pomocou argumentu časť, ktorý je prítomný v každej z funkcií balíka. Možné hodnoty: začiatok, koniec, sekvencia, dĺžka.

previous_month(part = "start")    # начало периода
previous_month(part = "end")      # конец периода
previous_month(part = "sequence") # последовательность дат
previous_month(part = "length")   # количество дней в периоде

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

  • x — referenčný dátum, od ktorého sa bude počítať časové obdobie, štandardne aktuálny dátum;
  • n — Počet intervalov, ktoré budú zahrnuté do obdobia, napríklad predchádzajúce 3 týždne;
  • part — Ktorá zložka predmetu tpr musíte štandardne získať all;
  • week_start — Argument je prítomný len vo funkciách na prácu s týždňami a umožňuje nastaviť číslo dňa v týždni, ktorý sa bude považovať za jeho začiatok. Predvolene je začiatok týždňa pondelok, ale môžete nastaviť ľubovoľný od 1 - pondelok až 7 - nedeľa.

Môžete teda vypočítať akékoľvek časové obdobie vzhľadom na aktuálny alebo iný daný dátum; tu je niekoľko ďalších príkladov:

# получить 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

6. októbra je nedeľa:
Práca s dátumami v R (základné možnosti, ako aj balíčky lubridate a timeperiodsR)

Potrebujeme obdobie, ktoré v porovnaní so 6. októbrom bude trvať predchádzajúce 3 týždne. Nepočítajúc týždeň, ktorý zahŕňa samotný 6. október. Podľa toho ide o obdobie od 9. septembra do 29. septembra.

Práca s dátumami v R (základné možnosti, ako aj balíčky lubridate a timeperiodsR)

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

V tomto príklade nás zaujíma mesiac, ktorý bol pred 4 mesiacmi, ak začneme od 16. septembra 2019, tak to bol máj 2019.

Filtrovanie vektora dátumov pomocou časových obdobíR

Ak chcete filtrovať dátumy timeperiodsR Existuje niekoľko operátorov:

  • %left_out% - porovná dva objekty triedy tpr a vráti hodnotu z ľavého, ktorá chýba v pravom.
  • %left_in% - porovná dva objekty triedy tpr a vráti dátumy z ľavého objektu, ktoré sú zahrnuté v pravom.
  • %right_out% - porovná dva objekty triedy tpr a vráti hodnotu z pravého, ktorá chýba ľavému.
  • %right_in% - porovná dva objekty triedy tpr a vráti dátumy z pravého objektu, ktoré sú prítomné v ľavom objekte.

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

Pri balíku timeperiodsR existuje oficiálna, ruskojazyčná Zoznam videí YouTube.

Záver

Podrobne sme skúmali triedy objektov, ktoré sú navrhnuté v jazyku R na prácu s dátumami. Teraz tiež môžete vykonávať aritmetické operácie s dátumami a rýchlo získať akékoľvek časové obdobia pomocou balíka timeperiodsR.

Ak máte záujem o jazyk R, pozývam vás na odber môjho telegramového kanála R4marketing, v ktorej dennodenne zdieľam užitočné materiály o používaní jazyka R pri riešení vašich každodenných problémov.

Zdroj: hab.com

Pridať komentár