Pridobite trenutno datum v katerem koli programskem jeziku, operacija je ekvivalentna "Hello world!". Jezik R ni izjema.
V tem članku bomo razjasnili, kako delati z datumi v osnovni sintaksi jezika R, ter razpravili o več koristnih paketih, ki širijo njegove možnosti pri delu z datumi:
lubridate— paket, ki omogoča opravljanje aritmetičnih izračunov med datumi;timeperiodsR— paket za delo s časovnimi intervali in njihovimi komponentami.

Vsebina
Če vas zanima analiza podatkov in posebej jezik R, vas morda zanimajo moji in kanali. Večina vsebine se posveča jeziku R.
1.1.
1.2.
2.1.
2.2.
2.3.
3.1.
3.2.
Delo z datumi v osnovni sintaksi R
Pretvorba besedila v datum
V osnovnem R obstaja niz funkcij za delo z datumi. Slabost osnovne sintakse je, da je zapis imen in argumentov funkcij zelo razdrobljen in praktično nima logične povezave. Kljub temu je potrebno poznati osnovne funkcije jezika, zato pričnimo z njimi.
Najpogosteje pri nalaganju podatkov v R, iz csv datotek ali drugih virov, dobite datum v obliki besedila. Da to besedilo pretvorite v pravi tip podatkov, uporabite funkcijo 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"Privzeto as.Date() sprejme datum v dveh formatih: GGGG-MM-DD ili GGGG/MM/DD.
Če so v vaši zbirki podatkov datumi predstavljeni v kakršnem koli drugem formatu, lahko za pretvorbo uporabite argument format.
as.Date("September 26, 2019", format = "%B %d, %Y")format sprejme v besedilni obliki operaterje, ki označujejo kakršenkoli časovni interval in njegov format, najpogosteje uporabljene vrednosti so navedene v spodnji tabeli:
Format
Opis
%d
Številka dneva v mesecu
%a
Kratek naziv dneva v tednu
%A
Polno ime dneva v tednu
%w
Številka dneva v tednu (0-6, kjer je 0 nedelja)
%m
Dvodigitna oznaka meseca (01-12)
%b
Kratek naziv meseca (apr, mar, …)
%B
Polno ime meseca
%y
Dvodigitna oznaka leta
%Y
Čtiridigitna oznaka leta
%j
Številka dneva v letu (001 — 366)
%U
Številka tedna v letu (00 — 53), začetek tedna Nedelja
%W
Številka tedna v letu (00 — 53), začetek tedna Ponedeljek
Glede na to, "26. september 2019" je — polno ime meseca, dan in leto. Ta format datuma lahko opišemo z naslednjimi operatorji:"%B %d, %Y".
Kje:
%B— Polno ime meseca%d— Številka dneva v mesecu%Y— Štirištevilčno označevanje leta
Pri opisovanju formata datuma je pomembno vključiti vse dodatne simbole iz vaše vrstice, na primer pomišljaje, vejice, pike, presledke in tako naprej. V mojem primeru, "26. september 2019", po datumu stoji vejica, in v opis formata je prav tako potrebno dodati vejico:"%B %d, %Y".
Obstajajo situacije, ko prejmete datum, ki ne le, da ne ustreza standardnim formatom (LLLL-MM-DD ali LLLL/MM/DD), ampak je tudi v jeziku, ki se razlikuje od privzetega jezika vašega operacijskega sistema. Na primer, prenesli ste podatke, kjer je datum naveden v takšni obliki: "15. december 2019". Pred pretvorbo te vrstice v datum morate spremeniti lokalno nastavitev.
# Меняем локаль
Sys.setlocale("LC_TIME", "Russian")
# Конвертируем строку в дату
as.Date("Декабрь 15, 2019 г.", format = "%B %d, %Y")Izvlečenje komponent datuma v osnovnem R
V osnovnem R ni veliko funkcij, ki omogočajo izločitev katerega koli dela datuma iz objekta razreda Datum.
current_date <- Sys.Date() # trenutni datum
weekdays(current_date) # pridobiti številko dne v tednu
months(current_date) # pridobiti številko meseca v letu
quarters(current_date) # pridobiti številko četrtletja v letuPoleg osnovnega razreda objektov Datum v osnovnem R obstajata še 2 tipa podatkov, ki hranita časovno oznako: POSIXlt, POSIXct. Glavna razlika teh razredov je v tem, da poleg datuma hranita tudi čas. Datum Sys.time()
# получить текущую дату и время
current_time <- Sys.time()
# узнать класс объекта current_time
class(current_time)# "POSIXct" "POSIXt"
Funkcija vrne trenutni datum in čas v formatu . Ta format je po pomenu podoben POSIXctUNIXTIME , in hrani število sekund od začetka UNIX dobe(polnoč (UTC) z 31. decembra 1969 na 1. januar 1970) in prav tako hrani čas in datum ter vse njihove komponente. Zato je objekt z bolj zapleteno strukturo, iz katerega je enostavno pridobiti katero koli komponento datuma in časa, saj v bistvu.
Razred POSIXlt Pretvorba številskih in besedilnih podatkov v formate POSIXlt it 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 izvaja s funkcijami as.POSIXct() as.POSIXlt() in . Te funkcije imajo majhen nabor argumentov.x — Številka, niz ali objekt razreda
- , ki ga je treba pretvoriti; Datumtz — Časovni pas, privzeto "GMT";
- format — Opis formata datuma, v katerem so podatki predstavljeni, posredovani v argumentu x;
- format — Описание формата даты в которым представлены данные передаваемые в аргумент x;
- origin — Se uporablja le pri pretvorbi števila v POSIX, v ta argument je treba posredovati objekt datuma in časa, od katerega se začenja šteti sekunde. Običajno se uporablja za pretvorbo iz UNIXTIME.
Če so vaši podatki o datumu in času predstavljeni v , in hrani število sekund od začetka UNIX dobe, za njihovo pretvorbo v razumljiv, berljiv datum uporabite naslednji primer:
# Конвертируем UNIXTIME в читаемую дату
as.POSIXlt(1570084639, origin = "1970-01-01")V origin lahko navedete katero koli časovno žig. Na primer, če so v vaših podatkih datum in čas navedeni kot število sekund od 15. septembra 2019 ob 12:15, za pretvorbo v datum uporabite:
# Конвертируем UNIXTIME в дату учитывая что начало отсчёта 15 сентября 2019 12:15
as.POSIXlt(1546123, origin = "2019-09-15 12:15:00")Delo z datumi s pomočjo paketa lubridate
lubridate verjetno najpopularnejši paket za delo z datumi v programskem jeziku R. Ponuja vam še tri dodatne razrede.
- durations — trajanje, tj. število sekund med dvema časovnima žigoma;
- periods — obdobja omogočajo izračunavanje med datumi z razumljivimi intervali za ljudi: dnevi, meseci, tedni itd.;
- intervals — objekti, ki zagotavljajo začetni in končni trenutek časa.
Namestitev dodatnih paketov v jeziku R poteka s standardno funkcijo install.packages().
Namestitev paketa lubridate:
install.packages("lubridate")Pretvorba besedila v datum s pomočjo lubridate
Funkcije paketa lubridate znatno poenostavijo postopek pretvorbe besedila v datum, prav tako pa vam omogočajo izvajanje vseh aritmetičnih operacij z datumi in časom.
Za pridobitev trenutnega datuma ali datuma in časa vam bodo v pomoč funkcije today() in now().
today() # trenutni datum
now() # trenutni datum in časZa pretvorbo niza v datum v lubridate obstaja cela družina funkcij, katerih imena so vedno sestavljena iz treh črk in označujejo zaporedje komponent datuma:
- y — leto
- m — mesec
- d — dan
Seznam funkcij za pretvorbo besedila v datum preko lubridate
ymd()ydm()mdy()myd()dmy()dym()yq()
Nekaj primerov za pretvorbo nizov v datume:
ymd("2017 jan 21")
mdy("March 20th, 2019")
dmy("1st april of 2018")Kot vidite, lubridate znatno bolj učinkovito prepozna opis datumov v tekstu in vam omogoča pretvorbo besedila v datum, ne da bi potrebovali dodatne operatorje za opis formata.
Izvlečenje komponent dat s pomočjo paketa lubridate
Prav tako lahko s pomočjo lubridate pridobite katero koli komponento datuma:
dt <- ymd("2017 jan 21")
year(dt) # leto
month(dt) # mesec
mday(dt) # dan v mesecu
yday(dt) # dan v letu
wday(dt) # dan v tednuAritmetične operacije z datumi
Toda, najbolj pomembna in osnovna funkcionalnost lubridate je v možnosti izvajanja različnih aritmetičnih operacij z datumi.
Zaokrożenie daty realizowane jest przez trzy funkcje:
floor_date— zaokrąglenie do najbliższego minionego czasuceiling_date— zaokrąglenie do najbliższego przyszłego czasuround_date— zaokrąglenie do najbliższego czasu
Każda z tych funkcji ma argument unit, który umożliwia określenie jednostki zaokrąglania: second, minute, hour, day, week, month, bimonth, quarter, season, halfyear, year
dt <- ymd("2017 jan 21")
round_date(dt, unit = "month") # zaokrąglić do miesiąca
round_date(dt, unit = "3 month") # zaokrąglić do 3 miesięcy
round_date(dt, unit = "quarter") # zaokrąglić do kwartału
round_date(dt, unit = "season") # zaokrąglić do sezonu
round_date(dt, unit = "halfyear") # zaokrąglić do półroczaZatem przyjrzyjmy się, jak uzyskać datę, która będzie za 8 dni od daty dzisiejszej oraz wykonywać różne inne obliczenia arytmetyczne między dwiema datami.
today() + days(8) # jaka będzie data za 8 dni
today() - months(2) # jaka była data 2 miesiące temu
today() + weeks(12) # jaka będzie data za 12 tygodni
today() - years(2) # jaka była data 2 lata temuUłatwiona praca z okresami, pakiet timeperiodsR.
timeperiodsR — nowy pakiet do pracy z datami, który został opublikowany na CRAN we wrześniu 2019 roku.
Namestitev paketa timeperiodsR:
install.packages("timeperiodsR")Głównym celem jest szybkie określenie pewnego okresu czasowego w odniesieniu do danej daty. Na przykład za pomocą jego funkcji możesz łatwo:
- Uzyskać zeszły tydzień, miesiąc, kwartał lub rok w R.
- Uzyskać określoną liczbę okresów czasowych w odniesieniu do daty, na przykład minione 4 tygodnie.
- Łatwo wydobywać z uzyskanego okresu czasowego jego składniki: datę początkową i końcową, liczbę dni, które się w nim znajdują, oraz całą sekwencję dat, które wchodzą w ten zakres.
Nazwy wszystkich funkcji pakietu timeperiodsR są intuicyjnie zrozumiałe i składają się z dwóch części: kierunek_okres, kjer:
- kierunek w którym należy się poruszać w odniesieniu do danej daty: last_n, previous, this, next, next_n.
- czasowy okres do obliczania okresu: day, week, month, quarter, year.
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()
Časovni intervali v timeperiodsR
Te funkcje są przydatne w sytuacjach, gdy musisz tworzyć raporty na podstawie danych z poprzedniego tygodnia lub miesiąca. Aby uzyskać zeszły miesiąc, skorzystaj z funkcji o tej samej nazwie previous_month():
prmonth <- previous_month()Počakali boste objekt prmonth klasa tpr, iz katerega lahko enostavno pridobite naslednje komponente:
- datum začetka obdobja, v našem primeru to je prejšnji mesec
- datum konca obdobja
- število dni, ki so vključeni v obdobje
- zaporedje datumov, ki so vključeni v obdobje
Vsak od komponent lahko pridobite na različne načine:
# первый день периода
prmonth$start
start(prmonth)
# последний день периода
prmonth$end
end(prmonth)
# последовательность дат
prmonth$sequence
seq(prmonth)
# количество дней входящих в период
prmonth$length
length(prmonth)Prav tako lahko pridobite katero koli od komponent z uporabo argumenta part, ki je prisoten v vsaki funkciji paketa. Možne vrednosti: start, end, sequence, length.
previous_month(part = "start") # začetek obdobja
previous_month(part = "end") # konec obdobja
previous_month(part = "sequence") # zaporedje datumov
previous_month(part = "length") # število dni v obdobjuTorej, poglejmo vse argumente, ki so na voljo v funkcijah paketa timeperiodsR:
x— Referenčni datum, od katerega bo izračunano časovno obdobje, privzeto trenutni datum;n— Število intervalov, ki bodo vključeni v obdobje, na primer 3 prejšnje tedne;part— Katero komponento objektatprje potrebno pridobiti, privzetoall;week_start— Argument je prisoten le v funkcijah za delo s tedni in omogoča določitev številke dneva v tednu, ki bo štela kot njen začetek; privzeto je začetek tedna ponedeljek, vendar lahko določite katerikoli dan od 1 – ponedeljek do 7 – nedelja.
Tako lahko izračunate katero koli časovno obdobje glede na trenutni ali kateri koli drug določen datum, tukaj je še nekaj primerov:
# получить 3 прошлые недели
# от 6 октября 2019 года
# начало недели - понедельник
last_n_weeks(x = "2019-10-06",
n = 3,
week_start = 1) Časovno obdobje: od 9. septembra 2019, ponedeljek do 29. septembra 2019, nedelja6. oktober je nedelja:

Potrebujemo obdobje, ki se glede na 6. oktober razteza na 3 prejšnje tedne. Ne vključuje tedna, v katerega spada sam 6. oktober. Tako je to obdobje od 9. do 29. septembra.

# получить месяц отстающий на 4 месяца
# от 16 сентября 2019 года
previous_month(x = "2019-09-16", n = 4) Časovno obdobje: od 1. maja 2019, sreda do 31. maja 2019, petekV tem primeru nas zanima mesec, ki je bil 4 mesece nazaj, če se osredotočimo na 16. september 2019, torej je to bil maj 2019.
Filtriranje vektorja datumov s pomočjo timeperiodsR
Za filtriranje datumov v timeperiodsR je na voljo več operatorjev:
- %left_out% — primerja dva objekta razreda tpr in vrne vrednost iz levega, ki manjka v desnem.
- %left_in% — primerja dva objekta razreda tpr in vrne datume iz levega objekta, ki so vključeni v desnega.
- %right_out% — primerja dva objekta razreda tpr in vrne vrednost iz desnega, ki manjka v levem.
- %right_in% — primerja dva objekta razreda tpr in vrne datume iz desnega objekta, ki so prisotni v levem.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
period1 %left_in% period2 # pridobiti datume iz period1, ki spadajo v period2
period1 %left_out% period2 # pridobiti datume iz period1, ki ne spadajo v period2
period1 %right_in% period2 # pridobiti datume iz period2, ki spadajo v period1
period1 %right_out% period2 # pridobiti datume iz period2, ki ne spadajo v period1Paket timeperiodsR ima uradni, slovenski .
Zaključek
Podrobno smo obravnavali razrede objektov, ki so namenjeni v jeziku R za delo z datumi. Sedaj tudi znate izvajati aritmetične operacije nad datumi in hitro pridobiti kakršna koli časovna obdobja s pomočjo paketa. timeperiodsR.
Če vas zanima jezik R, vas vabim, da se naročite na moj Telegram kanal. , kjer na dnevni osnovi delim koristne materiale o uporabi jezika R pri reševanju svojih vsakodnevnih nalog.
Izvor: habr.com
