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

Získejte aktuální datum v libovolném programovacím jazyce, což je operace ekvivalentní "Ahoj světe!" Jazyk R není výjimkou.

V tomto článku se podíváme na to, 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, který umožňuje provádět aritmetické výpočty mezi daty;
  • timeperiodsR — balíček pro práci s časovými intervaly a jejich součástmi.

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

Obsah

Pokud máte zájem o analýzu dat a zejména o jazyk R, mohl by vás zajímat můj telegram и 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řevést text na datum
    1.2. Extrakce datových složek v základním R
  2. Práce s datlemi pomocí lubridačního balíčku
    2.1. Převeďte text na datum pomocí lubridátu
    2.2. Extrakce datových komponent pomocí mazacího balíčku
    2.3. Aritmetické operace s daty
  3. Zjednodušená práce s obdobími, balík timeperiodsR
    3.1. Časové intervaly v časových obdobíchR
    3.2. Filtrování vektoru dat pomocí timeperiodsR
  4. Závěr

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

Převést text na datum

Basic R má sadu funkcí pro práci s daty. Nevýhodou základní syntaxe je, že případ jmen funkcí a argumentů je velmi rozptýlený a prakticky nemá žádnou logickou souvislost. Je však potřeba znát základní funkce jazyka, proto začneme jimi.

Nejčastěji při načítání dat do R, ze souborů csv nebo jiných zdrojů, obdržíte datum jako text. Chcete-li tento text převést 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() přijímá datum ve dvou formátech: YYYY-MM-DD nebo RRRR/MM/DD.
Pokud vaše datová sada obsahuje data v jiném formátu, můžete použít argument format.

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

formát přijímá operátory ve formě řetězce označující libovolný č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 pro název 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
Dvoumístné označení měsíce (01-12)

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

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

%y
Dvoumístné označení roku

%Y
Čtyřmístné 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í

V souladu s tím je „26. září 2019“ celý název měsíce, data a roku. Tento formát data lze popsat pomocí operátorů takto:"%B %d, %Y".

Kde:

  • %B — Celé jméno měsíce
  • %d — Číslo dne v měsíci
  • %Y — Čtyřmístné označení roku

Při popisu formátu data je důležité zahrnout všechny další znaky z vašeho řetězce, jako jsou pomlčky, čárky, tečky, mezery a tak dále. V mém příkladu „26. září 2019“ je za datem čárka a také musíte čárku vložit do popisu formátu:"%B %d, %Y".

Jsou situace, kdy obdržíte datum, které nejenže neodpovídá standardním formátům (RRRR-MM-DD nebo RRRR/MM/DD), ale také v jazyce, který se liší od výchozího jazyka nainstalovaného ve vašem operačním systému. Například jste stáhli data, kde je datum uvedeno takto: „15. prosince 2019“. Před převodem tohoto řetězce na datum musíte změnit národní prostředí.

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

Extrakce datových složek v základním R

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

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

Kromě hlavní třídy objektů Datum v základním R existují 2 další datové typy, které ukládají časové razítko: POSIXlt, POSIXct. Hlavní rozdíl mezi těmito třídami a Datum je, že kromě data ukládají čas.

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

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

# "POSIXct" "POSIXt"

Funkce Sys.time() vrátí aktuální datum a čas ve formátu POSIXct. Tento formát je svým významem podobný UNIXTIMEa ukládá počet sekund od začátku éry UNIX (půlnoc (UTC) od 31. prosince 1969 do 1. ledna 1970).

Třída POSIXlt také ukládá čas a datum a všechny jejich součásti. Jedná se tedy o objekt se složitější strukturou, ze kterého je však snadné získat jakoukoli složku data a času, protože ve skutečnosti POSIXlt tento lest.

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

Převod číselných a textových dat do formátů POSIX* prováděné funkcemi as.POSIXct() и as.POSIXlt(). Tyto funkce mají malou sadu argumentů.

  • x — Číslo, řetězec nebo objekt třídy Datum, který je třeba převést;
  • tz — Часовой пояс, по умолчанию "GMT";
  • format — Popis formátu data, ve kterém jsou reprezentována data předaná argumentu x;
  • origin — Používá se pouze při převodu čísla na POSIX; do tohoto argumentu musíte předat objekt data a čas, od kterého se počítají sekundy. Obvykle se používá pro překlad z UNIXTIME.

Pokud jsou vaše informace o datu a čase v UNIXTIMEa poté je převést na jasné a čitelné datum použijte následující příklad:

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

V počátku můžete zadat libovolné časové razítko. Pokud vaše data například obsahují datum a čas jako počet sekund od 15. září 2019 12:15, pak 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 datlemi pomocí lubridačního balíčku

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

  • trvání — trvání, tzn. počet sekund mezi dvěma časovými razítky;
  • období - období umožňuje provádět výpočty mezi daty v intervalech čitelných člověkem: dny, měsíce, týdny atd.;
  • intervaly - objekty, které poskytují počáteční a koncový bod v čase.

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

Instalace balíčku lubridate:

install.packages("lubridate")

Převeďte text na datum pomocí lubridátu

Vlastnosti balíčku lubridate výrazně zjednodušit proces převodu textu na datum a také vám umožní provádět jakékoli aritmetické operace s daty a časy.

Funkce vám pomohou získat aktuální datum nebo datum a čas today() и now().

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

Chcete-li převést řetězec na datum v lubridate Existuje celá rodina funkcí, jejichž názvy se vždy skládají ze tří písmen a označují posloupnost složek data:

  • r - 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ů převodu řetězců na data:

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

Jak vidíte lubridate Je mnohem efektivnější při rozpoznávání popisů data jako textu a umožňuje převést text na datum bez použití dalších operátorů k popisu formátu.

Extrakce datových komponent pomocí mazacího balíčku

Také pomocí lubridate můžete získat jakoukoli komponentu od data:

dt <- ymd("2017 jan 21")

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

Aritmetické operace s daty

Ale nejdůležitější a základní funkce lubridate je schopnost 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 — zaokrouhlování do blízkého budoucího času
  • round_date - zaokrouhlení na nejbližší čas

Každá z těchto funkcí má argument jednotkacož umožňuje určit jednotku zaokrouhlení: sekunda, minuta, hodina, den, týden, měsíc, dvouměsíční, čtvrtletí, sezóna, půlrok, ​​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") # округлить до полугодия

Pojďme tedy zjistit, jak získat datum, které je 8 dní po aktuálním datu, a provést různé další aritmetické výpočty mezi těmito dvěma daty.

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

Упрощённая работа с периодами, пакет timeperiodsR.

timeperiodsR — nový balíček pro práci s daty, který byl zveřejně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 danému datu. Pomocí jeho funkcí můžete například snadno:

  • Získejte poslední týden, měsíc, čtvrtletí nebo rok v R.
  • Získejte zadaný počet časových intervalů vzhledem k datu, například poslední 4 týdny.
  • Z výsledného časového intervalu je snadné extrahovat jeho složky: počáteční a koncové datum, počet dní zahrnutých v intervalu, celou sekvenci dat, která jsou v něm zahrnuta.

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

  • směr ve kterém se musíte posunout vzhledem k danému datu: last_n, previous, this, next, next_n.
  • dočasné interval pro výpočet období: den, týden, měsíc, čtvrtletí, rok.

Kompletní 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 časových obdobíchR

Tyto funkce jsou užitečné v případech, kdy potřebujete sestavovat sestavy na základě dat z minulého týdne nebo měsíce. Chcete-li získat poslední měsíc, použijte stejnojmennou funkci previous_month():

prmonth <- previous_month()

Poté budete mít objekt prměsíc třída tpr, ze kterého lze snadno získat následující komponenty:

  • datum začátku období, v našem příkladu je to poslední měsíc
  • datum ukončení období
  • počet dnů zahrnutých do období
  • sled dat zahrnutých v období

Kromě toho můžete každou z komponent získat různými způsoby:

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

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

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

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

Kteroukoli z komponent můžete také získat pomocí argumentu část, který je přítomen v každé z funkcí balíčku. Možné hodnoty: začátek, konec, sekvence, délka.

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

Podívejme se tedy na všechny argumenty dostupné ve funkcích balíčku timeperiodsR:

  • x — Referenční datum, od kterého se bude počítat časové období, implicitně aktuální datum;
  • n — Počet intervalů, které budou zahrnuty do období, například předchozí 3 týdny;
  • part — Která složka objektu tpr musíte získat, ve výchozím nastavení all;
  • week_start — Argument je přítomen 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. Ve výchozím nastavení je začátek týdne pondělí, ale můžete nastavit libovolný od 1 - pondělí až 7 - neděle.

Můžete tedy vypočítat jakékoli časové období vzhledem k aktuálnímu nebo jinému danému datu; zde je několik dalších příkladů:

# получить 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. října je neděle:
Práce s daty v R (základní možnosti, stejně jako balíčky lubridate a timeperiodsR)

Potřebujeme období, které vzhledem k 6. říjnu zabere předchozí 3 týdny. Nezahrnuje týden, který zahrnuje samotný 6. říjen. Podle toho se jedná o období od 9. září do 29. září.

Práce s daty v R (základní možnosti, stejně jako 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 příkladu nás zajímá měsíc, který byl před 4 měsíci, pokud začneme od 16. září 2019, pak to byl květen 2019.

Filtrování vektoru dat pomocí timeperiodsR

Chcete-li filtrovat data v timeperiodsR Existuje několik operátorů:

  • %left_out% - porovná dva objekty třídy tpr a vrátí hodnotu z levého, která chybí v pravém.
  • %left_in% - porovná dva objekty třídy tpr a vrátí data z levého objektu, která jsou zahrnuta v pravém.
  • %right_out% - porovná dva objekty třídy tpr a vrátí hodnotu z pravého, která chybí levému.
  • %right_in% - porovná dva objekty třídy tpr a vrátí data z pravého objektu, která jsou přítomna v levém.

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

U balíčku timeperiodsR existuje oficiální, ruskojazyčný Seznam videí na YouTube.

Závěr

Podrobně jsme zkoumali třídy objektů, které jsou navrženy v jazyce R pro práci s daty. Nyní také můžete provádět aritmetické operace s daty a rychle získat jakékoli časové období pomocí balíčku timeperiodsR.

Pokud máte zájem o jazyk R, zvu vás k odběru mého telegramového kanálu R4marketing, ve kterém denně sdílím užitečné materiály o používání jazyka R při řešení vašich každodenních problémů.

Zdroj: www.habr.com

Přidat komentář