ProHoster > Blog > administracja > Praca z datami w R (podstawowe możliwości, a także pakiety lubridate i timeperiodsR)
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.
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.
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ę:
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.
# получить месяц отстающий на 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.