Praca z datami w R (podstawowe możliwości, a także pakiety lubridate i timeperiodsR)

Uzyskaj aktualną datę w dowolnym języku programowania, co jest równoznaczne z operacją „Witaj, świecie!” Język R nie jest wyjątkiem.

W tym artykule przyjrzymy się, jak działa praca z datami w podstawowej składni języka R, a także przyjrzymy się kilku przydatnym pakietom, które rozszerzają jego możliwości podczas pracy z datami:

  • lubridate — pakiet umożliwiający wykonywanie obliczeń arytmetycznych pomiędzy datami;
  • timeperiodsR — pakiet do pracy z przedziałami czasowymi i ich składowymi.

Praca z datami w R (podstawowe możliwości, a także pakiety lubridate i timeperiodsR)

Zawartość

Jeśli interesuje Cię analiza danych, a w szczególności język R, być może zainteresuje Cię mój telegram и youtube kanały. Większość treści jest poświęcona językowi R.

  1. Praca z datami w podstawowej składni języka R
    1.1. Konwertuj tekst na bieżąco
    1.2. Wyodrębnianie składników daty w podstawowym języku R
  2. Praca z datami przy użyciu pakietu lubridate
    2.1. Konwertuj dotychczasowy tekst za pomocą lubridate
    2.2. Wyodrębnianie składników daty przy użyciu pakietu lubridate
    2.3. Operacje arytmetyczne na datach
  3. Uproszczona praca z okresami, pakiet timeperiodsR
    3.1. Przedziały czasowe w okresach czasuR
    3.2. Filtrowanie wektora dat za pomocą timeperiodsR
  4. wniosek

Praca z datami w podstawowej składni języka R

Konwertuj tekst na bieżąco

Basic R posiada zestaw funkcji do pracy z datami. Wadą podstawowej składni jest to, że przypadek nazw funkcji i argumentów jest bardzo rozproszony i praktycznie nie ma żadnego związku logicznego. Trzeba jednak znać podstawowe funkcje języka, więc od nich zaczniemy.

Najczęściej podczas ładowania danych do R, z plików CSV lub innych źródeł, otrzymujesz datę w postaci tekstowej. Aby przekonwertować ten tekst na właściwy typ danych należy skorzystać z funkcji 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"

Domyślnie as.Date() akceptuje datę w dwóch formatach: RRRR-MM-DD lub RRRR/MM/DD.
Jeśli Twój zbiór danych zawiera daty w innym formacie, możesz użyć argumentu format.

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

format akceptuje operatory w formie string oznaczającej dowolny przedział czasu oraz jego format; najczęściej stosowane wartości przedstawia poniższa tabela:

Format
Opis

%d
Numer dnia w miesiącu

%a
Skrót nazwy dnia tygodnia

%A
Pełna nazwa dnia tygodnia

%w
Numer dnia tygodnia (0-6, gdzie 0 to niedziela)

%m
Dwucyfrowe oznaczenie miesiąca (01-12)

%b
Skrót nazwy miesiąca (apr, mar, …)

%B
Pełna nazwa miesiąca

%y
Dwucyfrowe oznaczenie roku

%Y
Czterocyfrowe oznaczenie roku

%j
Numer dnia w roku (001 - 366)

%U
Numer tygodnia w roku (00 - 53), początek tygodnia niedziela

%W
Numer tygodnia w roku (00 - 53), początek tygodnia w poniedziałek

Odpowiednio „26 września 2019 r.” to pełna nazwa miesiąca, daty i roku. Ten format daty można opisać za pomocą operatorów w następujący sposób:"%B %d, %Y".

Gdzie:

  • %B — Pełna nazwa miesiąca
  • %d — Numer dnia w miesiącu
  • %Y — Czterocyfrowe oznaczenie roku

Opisując format daty, ważne jest, aby uwzględnić wszystkie dodatkowe znaki z ciągu, takie jak myślniki, przecinki, kropki, spacje itd. W moim przykładzie „26 września 2019 r.” po dacie jest przecinek, należy też wstawić przecinek w opisie formatu:"%B %d, %Y".

Zdarzają się sytuacje, gdy otrzymujesz datę, która nie tylko nie odpowiada standardowym formatom (RRRR-MM-DD lub RRRR/MM/DD), ale także w języku innym niż domyślny język zainstalowany w Twoim systemie operacyjnym. Na przykład pobrałeś dane, których data jest oznaczona w ten sposób: „15 grudnia 2019 r.” Przed konwersją tego ciągu na datę należy zmienić ustawienia regionalne.

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

Wyodrębnianie składników daty w podstawowym języku R

W podstawowym R nie ma wielu funkcji, które pozwalają wyodrębnić dowolną część daty z obiektu klasy Data.

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

Oprócz głównej klasy obiektu Data w podstawowym R istnieją jeszcze 2 typy danych, które przechowują znacznik czasu: POSIXlt, POSIXct. Główna różnica między tymi klasami i Data polega na tym, że oprócz daty przechowują czas.

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

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

# "POSIXct" "POSIXt"

Funkcja Sys.time() zwraca bieżącą datę i godzinę w formacie POSIXct. Ten format ma podobne znaczenie do UNIXTIMEi przechowuje liczbę sekund od początku ery UNIX-a (północ (UTC) od 31 grudnia 1969 do 1 stycznia 1970).

Klasa POSIXlt przechowuje także godzinę i datę oraz wszystkie ich elementy. Jest to zatem obiekt o bardziej złożonej strukturze, ale z którego łatwo jest uzyskać dowolny składnik daty i czasu, gdyż W rzeczywistości POSIXlt to podstęp.

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

Konwersja danych numerycznych i tekstowych do formatów POSIX* realizowane przez funkcje as.POSIXct() и as.POSIXlt(). Funkcje te mają mały zestaw argumentów.

  • x — Liczba, ciąg znaków lub obiekt klasy Data, który należy przekonwertować;
  • tz — strefa czasowa, domyślnie „GMT”;
  • format — Opis formatu daty, w jakim są reprezentowane dane przekazywane do argumentu x;
  • origin — Używany tylko przy konwersji liczby do formatu POSIX; do tego argumentu należy przekazać obiekt daty i godzinę, od której odliczane są sekundy. Zwykle używane do tłumaczenia z UNIXTIME.

Jeśli informacje o dacie i godzinie są dostępne UNIXTIME, a następnie, aby zamienić je na wyraźną, czytelną datę, skorzystaj z poniższego przykładu:

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

W Origin możesz określić dowolny znacznik czasu. Przykładowo, jeśli Twoje dane zawierają datę i godzinę jako liczbę sekund od 15 września 2019 r. o godzinie 12:15, to aby przekonwertować je na datę, użyj:

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

Praca z datami przy użyciu pakietu lubridate

lubridate Być może najpopularniejszy pakiet do pracy z datami w języku R. Zawiera trzy dodatkowe klasy.

  • trwanie — czas trwania, tj. liczba sekund pomiędzy dwoma znacznikami czasu;
  • okresy - okresy umożliwiają dokonywanie obliczeń pomiędzy datami w odstępach czytelnych dla człowieka: dni, miesiące, tygodnie i tak dalej;
  • interwały - obiekty zapewniające punkt początkowy i końcowy w czasie.

Instalacja dodatkowych pakietów w języku R odbywa się przy pomocy standardowej funkcji install.packages().

Instalowanie pakietu lubridate:

install.packages("lubridate")

Konwertuj dotychczasowy tekst za pomocą lubridate

Funkcje pakietu lubridate znacznie upraszczają proces konwersji tekstu na datę, a także pozwalają na wykonywanie dowolnych operacji arytmetycznych na datach i godzinach.

Funkcje pomogą Ci uzyskać aktualną datę lub datę i godzinę today() и now().

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

Aby przekonwertować ciąg na datę w lubridate Istnieje cała rodzina funkcji, których nazwy zawsze składają się z trzech liter i wskazują kolejność składników daty:

  • y - rok
  • m - miesiąc
  • dzień D

Lista funkcji do konwersji aktualnego tekstu za pomocą lubridate

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

Kilka przykładów konwersji ciągów znaków na daty:

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

Jak widzisz lubridate Znacznie skuteczniej rozpoznaje opisy dat jako tekstowe i pozwala na konwersję tekstu na datę bez użycia dodatkowych operatorów do opisu formatu.

Wyodrębnianie składników daty przy użyciu pakietu lubridate

Używam również lubridate możesz uzyskać dowolny komponent z daty:

dt <- ymd("2017 jan 21")

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

Operacje arytmetyczne na datach

Ale najważniejsza i podstawowa funkcjonalność lubridate to możliwość wykonywania różnych operacji arytmetycznych na datach.

Zaokrąglanie daty odbywa się za pomocą trzech funkcji:

  • floor_date — zaokrąglenie do najbliższego czasu przeszłego
  • ceiling_date — zaokrąglenie do czasu najbliższej przyszłości
  • round_date - zaokrąglenie do najbliższego czasu

Każda z tych funkcji ma argument jednostkaco pozwala określić jednostkę zaokrąglania: sekunda, minuta, godzina, dzień, tydzień, miesiąc, dwumiesięczny, kwartał, sezon, półrocze, 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") # округлить до полугодия

Zastanówmy się więc, jak uzyskać datę przypadającą 8 dni po bieżącej dacie i wykonaj różne inne obliczenia arytmetyczne między dwiema datami.

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

Uproszczona praca z okresami, pakiet timeperiodsR.

timeperiodsR — nowy pakiet do pracy z datami, który został opublikowany na platformie CRAN we wrześniu 2019 r.

Instalowanie pakietu timeperiodsR:

install.packages("timeperiodsR")

Głównym celem jest szybkie określenie określonego przedziału czasu w stosunku do danej daty. Korzystając z jego funkcji możesz na przykład łatwo:

  • Uzyskaj ostatni tydzień, miesiąc, kwartał lub rok w języku R.
  • Uzyskaj określoną liczbę przedziałów czasowych względem daty, na przykład ostatnie 4 tygodnie.
  • Z powstałego przedziału czasu łatwo wydobyć jego składowe: datę początkową i końcową, liczbę dni wchodzących w skład przedziału, cały ciąg dat, które się w nim mieszczą.

Nazwa wszystkich funkcji pakietu timeperiodsR są intuicyjne i składają się z dwóch części: kierunek_interwał, gdzie:

  • kierunek w którym musisz się poruszyć względem danej daty: last_n, poprzedni, ten, następny, następny_n.
  • tymczasowe interwał obliczyć okres: dzień, tydzień, miesiąc, kwartał, rok.

Pełny zestaw funkcji:

  • 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()

Przedziały czasowe w okresach czasuR

Funkcje te są przydatne w przypadkach, gdy zachodzi potrzeba zbudowania raportów w oparciu o dane z ostatniego tygodnia lub miesiąca. Aby uzyskać ostatni miesiąc, użyj funkcji o tej samej nazwie previous_month():

prmonth <- previous_month()

Po czym będziesz miał obiekt miesiąc klasa Tpr, z którego można łatwo uzyskać następujące składniki:

  • data początkowa okresu, w naszym przykładzie jest to ostatni miesiąc
  • data zakończenia okresu
  • liczba dni wchodzących w skład okresu
  • kolejność dat wchodzących w skład okresu

Co więcej, każdy z komponentów możesz pozyskać na różne sposoby:

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

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

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

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

Możesz także uzyskać dowolny komponent za pomocą argumentu część, który jest obecny w każdej z funkcji pakietu. Możliwe wartości: początek, koniec, sekwencja, długość.

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

Przyjrzyjmy się więc wszystkim argumentom dostępnym w funkcjach pakietu timeperiodsR:

  • x — Data referencyjna, od której będzie liczony okres czasu, domyślnie data bieżąca;
  • n — Liczba przerw, które będą uwzględnione w okresie, na przykład poprzednie 3 tygodnie;
  • part — Który składnik obiektu tpr domyślnie musisz uzyskać all;
  • week_start — Argument występuje tylko w funkcjach do pracy z tygodniami i pozwala ustawić numer dnia tygodnia, który będzie uważany za jego początek. Domyślnie początkiem tygodnia jest poniedziałek, ale można ustawić dowolny od 1 - poniedziałek do 7 - niedziela.

W ten sposób możesz obliczyć dowolny okres w stosunku do bieżącej lub dowolnej innej podanej daty; oto kilka innych przykładów:

# получить 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 października wypada w niedzielę:
Praca z datami w R (podstawowe możliwości, a także pakiety lubridate i timeperiodsR)

Potrzebujemy okresu, który w stosunku do 6 października zajmie poprzednie 3 tygodnie. Nie licząc tygodnia obejmującego sam 6 października. Zatem jest to okres od 9 września do 29 września.

Praca z datami w R (podstawowe możliwości, a także pakiety lubridate i 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

W tym przykładzie interesuje nas miesiąc, który był 4 miesiące temu, jeśli zaczniemy od 16 września 2019 r., to był to maj 2019 r.

Filtrowanie wektora dat za pomocą timeperiodsR

Aby filtrować daty w timeperiodsR Jest kilku operatorów:

  • %left_out% - porównuje dwa obiekty klasy tpr i zwraca z lewego obiektu wartość, której brakuje w prawym.
  • %left_in% - porównuje dwa obiekty klasy tpr i zwraca daty z lewego obiektu, które zawarte są w prawym.
  • %right_out% - porównuje dwa obiekty klasy tpr i zwraca z prawego obiektu wartość, której brakuje z lewego.
  • %right_in% - porównuje dwa obiekty klasy tpr i zwraca daty z prawego obiektu, które występują w lewym.

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

Na paczce timeperiodsR istnieje oficjalny, rosyjskojęzyczny Playlista YouTube.

wniosek

Szczegółowo sprawdziliśmy klasy obiektów zaprojektowane w języku R do pracy z datami. Również teraz możesz wykonywać operacje arytmetyczne na datach i szybko uzyskać dowolne okresy za pomocą pakietu timeperiodsR.

Jeżeli interesuje Cię język R, zapraszam do subskrypcji mojego kanału na telegramie R4marketing, w którym na co dzień udostępniam przydatne materiały dotyczące wykorzystania języka R w rozwiązywaniu codziennych problemów.

Źródło: www.habr.com

Dodaj komentarz