Práce s daty v jazyce R (základní možnosti, stejně jako balíčky lubridate a timeperiodsR)

Získat aktuální datum v jakémkoli programovacím jazyce je ekvivalentní k "Hello world!". Jazyk R není výjimkou.

V tomto článku prozkoumáme, jak funguje práce s daty v základní syntaxi jazyka R, a také se podíváme na několik užitečných balíčků, které rozšiřují jeho možnosti při práci s daty:

  • lubridate — balíček umožňující provádět aritmetické výpočty mezi daty;
  • timeperiodsR — balíček pro práci s časovými intervaly a jejich komponentami.

Práce s daty v jazyce R (základní možnosti, stejně jako balíčky lubridate a timeperiodsR)

Obsah

Pokud máte zájem o analýzu dat, zejména o jazyk R, možná vás budou zajímat moje telegram a youtube kanály. Většina obsahu je věnována jazyku R.

  1. Práce s daty v základní syntaxi R
    1.1. Převod textu na datum
    1.2. Extrakce komponentů data v základním R
  2. Práce s daty pomocí balíčku lubridate
    2.1. Převod textu na datum pomocí lubridate
    2.2. Extrakce komponentů dat pomocí balíčku lubridate
    2.3. Aritmetické operace s daty
  3. Zjednodušená práce s periody, balíček timeperiodsR
    3.1. Časové intervaly v timeperiodsR
    3.2. Filtrování vektoru dat pomocí timeperiodsR
  4. Závěr

Práce s daty v základní syntaxi R

Převod textu na datum

V základním R je k dispozici sada funkcí pro práci s daty. Nevýhodou základní syntaxy je, že registr názvů a argumentů funkcí je velmi roztříštěný a prakticky nemá logickou spojitost. Nicméně, základní funkce jazyka musí znát, takže začneme právě s nimi.

Při načítání dat do R, obvykle z csv souborů nebo jiných zdrojů, dostáváte datum ve formě textu. Abyste tento text převedli na správný datový typ, použijte funkci 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"

Ve výchozím nastavení as.Date() která přijímá datum ve dvou formátech: RRRR-MM-DD nebo RRRR/MM/DD.
Pokud jsou ve vašem datovém souboru data reprezentována v nějakém jiném formátu, můžete pro převod použít argument format.

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

format který přijímá v řetězci operátory označující nějaký časový interval a jeho formát, nejčastěji používané hodnoty jsou uvedeny v tabulce níže:

Formát
Popis

%d
Číslo dne v měsíci

%a
Zkratka názvu dne v týdnu

%A
Celé jméno dne v týdnu

%w
Číslo dne v týdnu (0-6, kde 0 je neděle)

%m
Dvoučíslí označení měsíce (01-12)

%b
Zkratka názvu měsíce (apr, mar, …)

%B
Celé jméno měsíce

%y
Dvoučíslí označení roku

%Y
Čtyřčíslí označení roku

%j
Číslo dne v roce (001 – 366)

%U
Číslo týdne v roce (00 — 53), začátek týdne Neděle

%W
Číslo týdne v roce (00 — 53), začátek týdne Pondělí

Tedy "26. září 2019" je — plné označení měsíce, číslo a rok. Tento formát data lze popsat pomocí operátorů takto:"%B %d, %Y".

Kde:

  • %B — Plné označení měsíce
  • %d — Číslo dne v měsíci
  • %Y — Čtyřciferné označení roku

Při popisu formátu data je důležité zahrnout všechny další znaky ve vašem řetězci, například pomlčky, čárky, tečky, mezery a tak dále. V mém příkladu, "26. září 2019", za datem stojí čárka, a v popisu formátu je také potřeba uvést čárku:"%B %d, %Y".

Jsou situace, kdy získáte datum, které neodpovídá standardním formátům (RRRR-MM-DD nebo RRRR/MM/DD), ale také v jazyce, který se liší od nastaveného ve vaší operačnímu systému jako výchozím. Například jste načetli data, kde je datum uvedeno takto: "15. prosince 2019". Před konverzí tohoto řetězce na datum je nutné změnit locale.

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

Extrakce komponentů data v základním R

V základním R není mnoho funkcí, které umožňují extrahovat jakoukoli část data z objektu třídy Date.

current_date <- Sys.Date() # aktuální datum
weekdays(current_date)     # získat číslo dne v týdnu
months(current_date)       # získat číslo měsíce v roce
quarters(current_date)     # získat číslo čtvrtletí v roce

Kromě hlavní třídy objektů Date v základním R existují také 2 typy dat, které uchovávají časovou značku: POSIXlt, POSIXct. Hlavní rozdíl těchto tříd je v tom, že kromě data uchovávají i čas. Date Sys.time()

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

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

# "POSIXct" "POSIXt"

Funkce vrací aktuální datum a čas ve formátu . Tento formát je významově podobný POSIXctUNIXTIME , a uchovává počet sekund od začátku UNIX éry(půlnoc (UTC) 31. prosince 1969 do 1. ledna 1970) také uchovává čas a datum, a všechny jejich komponenty. Proto je objektem s složitější strukturou, z kterého lze snadno získat jakoukoli komponentu data a času, protože v podstatě.

Třída POSIXlt Převod číselných a textových dat do formátů 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  # часовой пояс

POSIX* se provádí pomocí funkcí as.POSIXct() as.POSIXlt() a . Tyto funkce mají malou sadu argumentů.x — Číslo, řetězec nebo objekt třídy

  • , který je třeba převést; Datetz — Časové pásmo, výchozí "GMT";
  • format — Popis formátu data, ve kterém jsou data předána jako argument x;
  • formát — Popis formátu data, ve kterém jsou prezentována data předávaná v argumentu x;
  • origin — Používá se pouze při konverzi čísla na POSIX, do tohoto argumentu je nutné předat objekt data a času, od kterého se odpočítávají sekundy. Obvykle se používá k převodu z UNIXTIME.

Pokud jsou vaše údaje o datu a čase prezentovány v , a uchovává počet sekund od začátku UNIX éry, pak pro jejich konverzi na srozumitelné, čitelné datum použijte následující příklad:

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

V origin můžete zadat jakoukoli časovou značku. Například, pokud jsou ve vašich údajích datum a čas uvedeny jako počet sekund od 15. září 2019 12:15, pro převod na datum použijte:

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

Práce s daty pomocí balíčku lubridate

lubridate Snad nejpopulárnější balíček pro práci s daty v jazyce R. Poskytuje vám navíc tři další třídy.

  • durations — trvání, tj. počet sekund mezi dvěma časovými značkami;
  • periods — období umožňují provádět výpočty mezi daty srozumitelnými pro člověka intervaly: dny, měsíce, týdny a tak dále;
  • intervals — objekty poskytující počáteční a konečný moment času.

Instalace dalších balíčků v jazyce R se provádí standardní funkcí install.packages().

Instalace balíčku lubridate:

install.packages("lubridate")

Převod textu na datum pomocí lubridate

Funkce balíčku lubridate významně zjednodušují proces konverze textu na datum a také vám umožňují provádět jakékoli aritmetické operace s daty a časem.

Získání aktuálního data nebo data a času vám pomohou funkce today() a now().

today() # aktuální datum
now()   # aktuální datum a čas

Pro převod řetězce na datum v lubridate existuje celá řada funkcí, jejichž názvy se vždy skládají ze tří písmen a označují sekvenci komponentů data:

  • y — rok
  • m — měsíc
  • d — den

Seznam funkcí pro převod textu na datum pomocí lubridate

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

Několik příkladů pro převod řetězců na data:

ymd("2017 jan 21")
mdy("20. března 2019")
dmy("1. dubna 2018")

Jak vidíte, lubridate významně efektivněji rozpoznává popis dat ve formě textu a umožňuje vám převádět text na datum bez použití dalších operátorů pro popis formátu.

Extrakce komponentů dat pomocí balíčku lubridate

Také pomocí lubridate můžete získat jakoukoli složku z data:

dt <- ymd("2017 jan 21")

year(dt)  # rok
month(dt) # měsíc
mday(dt)  # den v měsíci
yday(dt)  # den v roce
wday(dt)  # den v týdnu

Aritmetické operace s daty

Ale nejdůležitější a základní funkce lubridate spočívá v možnosti provádět různé aritmetické operace s daty.

Zaokrouhlování data se provádí třemi funkcemi:

  • floor_date — zaokrouhlení na nejbližší minulý čas
  • ceiling_date — zaokrouhlení na nejbližší budoucí čas
  • round_date — zaokrouhlení na nejbližší čas

Každá z těchto funkcí má argument unit, který vám umožňuje specifikovat jednotku zaokrouhlování: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year

dt <- ymd("2017 jan 21")

round_date(dt, unit = "month")    # zaokroulit na měsíc
round_date(dt, unit = "3 month")  # zaokroulit na 3 měsíce
round_date(dt, unit = "quarter")  # zaokroulit na kvartál
round_date(dt, unit = "season")   # zaokroulit na sezonu
round_date(dt, unit = "halfyear") # zaokroulit na půlrok

Tak pojďme zjistit, jak získat datum, které bude za 8 dní po aktuálním datu, a provádět různé další aritmetické výpočty mezi dvěma daty.

today() + days(8)   # jaké datum bude za 8 dní
today() - months(2) # jaké datum bylo před 2 měsíci
today() + weeks(12) # jaké datum bude za 12 týdnů
today() - years(2)  # jaké datum bylo před 2 lety

Usnadněná práce s obdobími, balíček timeperiodsR.

timeperiodsR — nový balíček pro práci s daty, který byl publikován na CRAN v září 2019.

Instalace balíčku timeperiodsR:

install.packages("timeperiodsR")

Hlavním účelem je rychlé určení určitého časového intervalu vzhledem k zadanému datu. Například pomocí jeho funkcí můžete snadno:

  • Získat minulý týden, měsíc, kvartál nebo rok v R.
  • Získat zadaný počet časových intervalů vzhledem k datu, například poslední 4 týdny.
  • Snadno vyextrahovat z získaného časového intervalu jeho součásti: počáteční a koncovou datum, počet dní, které spadly do intervalu, a celou posloupnost dat, která do něj patří.

Názvy všech funkcí balíčku timeperiodsR jsou intuitivně srozumitelné a skládají se ze dvou částí: směr_interval, kde:

  • směr ve kterém se je třeba pohybovat vzhledem k zadanému datu: last_n, previous, this, next, next_n.
  • časová interval pro výpočet období: day, week, month, quarter, year.

Plná sada funkcí:

  • 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

Tyto funkce jsou užitečné v případech, kdy potřebujete sestavit zprávy na základě dat z minulého týdne či měsíce. Chcete-li získat minulý měsíc, použijte funkci se stejným názvem previous_month():

prmonth <- previous_month()

Po čem budete mít objekt prmonth třídy tpr, ze kterého lze snadno získat následující komponenty:

  • datum začátku období, v našem případě to byl minulý měsíc
  • datum konce období
  • počet dní, které spadají do období
  • posloupnost dat spadajících do období

A každý z komponentů lze získat různými způsoby:

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

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

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

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

Můžete také získat jakýkoli z komponentů pomocí argumentu part, který je přítomen v každé funkci balíčku. Možné hodnoty: start, end, sequence, length.

previous_month(part = "start")    # začátek období
previous_month(part = "end")      # konec období
previous_month(part = "sequence") # posloupnost dat
previous_month(part = "length")   # počet dní v období

Takže se podívejme na všechny argumenty dostupné ve funkcích balíčku timeperiodsR:

  • x — Referenční datum, od kterého se bude vypočítávat časové období, výchozí je aktuální datum;
  • n — Počet intervalů, které budou zahrnuty do období, například 3 předchozí týdny;
  • part — Jaký komponent objektu tpr je třeba získat, výchozí je all;
  • week_start — Argument přítomný pouze ve funkcích pro práci s týdny a umožňuje nastavit číslo dne v týdnu, který bude považován za jeho začátek, výchozím začátkem týdne je pondělí, ale můžete nastavit jakýkoli od 1 - pondělí po 7 - neděli.

Tímto způsobem můžete vypočítat libovolné časové období vzhledem k aktuálnímu nebo jakémukoli jinému zadanému datu, uvedu ještě několik příkladů:

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

 Časové období: od 9. září 2019, pondělí do 29. září 2019, neděle

6. října je neděle:
Práce s daty v jazyce R (základní možnosti, stejně jako balíčky lubridate a timeperiodsR)

Potřebujeme období, které vzhledem k 6. říjnu vezme 3 předchozí týdny. Nezačleňuje týden, do kterého 6. října spadá. Tím pádem to je období od 9. do 29. září.

Práce s daty v jazyce R (základní možnosti, stejně jako balíčky lubridate a timeperiodsR)

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

 Časové období: od 1. května 2019, středa do 31. května 2019, pátek

V tomto příkladu nás zajímá měsíc, který byl před 4 měsíci, pokud vycházíme z 16. září 2019, to byl tedy květen 2019.

Filtrování vektoru dat pomocí timeperiodsR

Pro filtrování dat v timeperiodsR existuje několik operátorů:

  • %left_out% — porovnává dva objekty třídy tpr a vrací hodnotu z levého, která chybí v pravém.
  • %left_in% — porovnává dvě objekty třídy tpr a vrací data z levého objektu, která spadají do pravého.
  • %right_out% — porovnává dva objekty třídy tpr a vrací hodnotu z pravého, která chybí v levém.
  • %right_in% — porovnává dva objekty třídy tpr a vrací data z pravého objektu, která jsou v levém.

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

period1 %left_in% period2   # získejte data z period1, která jsou v period2
period1 %left_out% period2  # získejte data z period1, která nejsou v period2
period1 %right_in% period2  # získejte data z period2, která jsou v period1
period1 %right_out% period2 # získejte data z period2, která nejsou v period1

O balíčku timeperiodsR existuje oficiální, český playlist na YouTube.

Závěr

Podrobně jsme se podívali na třídy objektů, které jsou v jazyce R určeny pro práci s daty. Také nyní umíte provádět aritmetické operace s daty a rychle získat jakékoliv časové období pomocí balíčku timeperiodsR.

Pokud vás zajímá jazyk R, zvu vás, abyste se přihlásili k mému telegram kanálu R4marketing, ve kterém dennodenně sdílím užitečné materiály o používání jazyka R při řešení svých každodenních úkolů.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster