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.

Obsah
Pokud máte zájem o analýzu dat, zejména o jazyk R, možná vás budou zajímat moje a kanály. Většina obsahu je věnována jazyku R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
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 roceKromě 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 časPro 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ýdnuAritmetické 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ý časceiling_date— zaokrouhlení na nejbližší budoucí časround_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ůlrokTak 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 letyUsnadně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 objektutprje třeba získat, výchozí jeall;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ěle6. října je neděle:

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áří.

# получить месяц отстающий на 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átekV 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 period1O balíčku timeperiodsR existuje oficiální, český .
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 , 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
