Delo z datumi v R (osnovne zmogljivosti, kot tudi paketa lubridate in timeperiodsR)

Pridobite trenutni datum v katerem koli programskem jeziku, operacija, ki je enakovredna "Hello world!" Jezik R ni izjema.

V tem članku si bomo ogledali, kako deluje delo z datumi v osnovni sintaksi jezika R, in si ogledali tudi več uporabnih paketov, ki širijo njegove zmogljivosti pri delu z datumi:

  • lubridate — paket, ki omogoča aritmetične izračune med datumi;
  • timeperiodsR — paket za delo s časovnimi intervali in njihovimi komponentami.

Delo z datumi v R (osnovne zmogljivosti, kot tudi paketa lubridate in timeperiodsR)

Vsebina

Če vas zanima analiza podatkov in še posebej jezik R, vas bo morda zanimal moj telegram и youtube kanalov. Večina vsebine je posvečena jeziku R.

  1. Delo z datumi v osnovni sintaksi R
    1.1. Pretvori besedilo v datum
    1.2. Ekstrahiranje komponent datuma v osnovnem R
  2. Delo z datumi s paketom lubridate
    2.1. Pretvorite besedilo v datum z lubridate
    2.2. Ekstrahiranje datljevih komponent z lubridate paketom
    2.3. Aritmetične operacije z datumi
  3. Poenostavljeno delo z obdobji, paket timeperiodsR
    3.1. Časovni intervali v časovnih obdobjihR
    3.2. Filtriranje vektorja datumov z uporabo timeperiodsR
  4. Zaključek

Delo z datumi v osnovni sintaksi R

Pretvori besedilo v datum

Basic R ima nabor funkcij za delo z datumi. Pomanjkljivost osnovne sintakse je, da so imena in argumenti funkcij zelo razpršeni in praktično nimajo logične povezave. Vendar pa morate poznati osnovne funkcije jezika, zato bomo začeli z njimi.

Najpogosteje pri nalaganju podatkov v R, iz datotek csv ali drugih virov prejmete datum kot besedilo. Če želite to besedilo pretvoriti v pravilno podatkovno vrsto, 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 oblikah: LLLL-MM-DD ali LLLL/MM/DD.
Če vaš nabor podatkov vsebuje datume v drugi obliki, lahko uporabite argument format.

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

format sprejema operatorje v obliki niza, ki označuje kateri koli časovni interval in njegovo obliko; najpogosteje uporabljene vrednosti so prikazane v spodnji tabeli:

Oblika
Opis

%d
Številka dneva v mesecu

%a
Okrajšava za ime dneva v tednu

%A
Polno ime dneva v tednu

%w
Številka dneva v tednu (0-6, kjer je 0 nedelja)

%m
Dvomestna oznaka meseca (01-12)

%b
Okrajšava imena meseca (apr, mar, …)

%B
Polno ime meseca

%y
Dvomestna oznaka leta

%Y
Štirimestna 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

V skladu s tem je »26. september 2019« polno ime meseca, datuma in leta. To obliko datuma je mogoče opisati z uporabo operatorjev, kot sledi:"%B %d, %Y".

Kje:

  • %B — Polno ime meseca
  • %d — Številka dneva v mesecu
  • %Y — Štirimestna oznaka leta

Ko opisujete obliko zapisa datuma, je pomembno, da vključite vse dodatne znake iz vašega niza, kot so pomišljaji, vejice, pike, presledki itd. V mojem primeru »26. september 2019« je za datumom vejica, vejico pa morate vstaviti tudi v opisu oblike:"%B %d, %Y".

Obstajajo situacije, ko prejmete datum, ki ne samo, da ne ustreza standardnim formatom (LLLL-MM-DD ali LLLL/MM/DD), ampak tudi v jeziku, ki se razlikuje od privzetega, nameščenega v vašem operacijskem sistemu. Na primer, prenesli ste podatke, kjer je datum naveden takole: »15. december 2019«. Preden pretvorite ta niz v datum, morate spremeniti jezik.

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

Ekstrahiranje komponent datuma v osnovnem R

V osnovnem R ni veliko funkcij, ki vam omogočajo, da iz predmeta razreda izvlečete kateri koli del datuma Datum.

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

Poleg glavnega predmeta razreda Datum v osnovnem R obstajata še 2 tipa podatkov, ki hranita časovni žig: POSIXlt, POSIXct. Glavna razlika med temi razredi in Datum je, da poleg datuma hranijo še čas.

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

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

# "POSIXct" "POSIXt"

Funkcija Sys.time() vrne trenutni datum in čas v obliki POSIXct. Ta oblika je po pomenu podobna UNIXTIME, in shrani število sekund od začetka dobe UNIX (opolnoč (UTC) od 31. decembra 1969 do 1. januarja 1970).

Razred POSIXlt shranjuje tudi uro in datum ter vse njune komponente. Zato gre za objekt z bolj zapleteno strukturo, iz katerega pa je enostavno pridobiti katero koli komponento datuma in časa, ker pravzaprav POSIXlt это Seznam.

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

Pretvarjanje številskih in besedilnih podatkov v formate POSIX* izvajajo funkcije as.POSIXct() и as.POSIXlt(). Te funkcije imajo majhen nabor argumentov.

  • x — Število, niz ali predmet razreda Datum, ki ga je treba pretvoriti;
  • tz — Časovni pas, privzeto "GMT";
  • format — Opis formata datuma, v katerem so predstavljeni podatki, posredovani argumentu x;
  • izvor — Uporablja se samo pri pretvorbi števila v POSIX; temu argumentu morate posredovati datumski objekt in čas, od katerega se štejejo sekunde. Običajno se uporablja za prevajanje iz UNIXTIME.

Če so vaši podatki o datumu in uri v UNIXTIME, nato pa jih pretvorite v jasen, berljiv datum, uporabite naslednji primer:

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

V izvoru lahko določite poljuben časovni žig. Na primer, če vaši podatki vsebujejo datum in čas kot število sekund od 15. septembra 2019 do 12:15, jih za pretvorbo v datum uporabite:

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

Delo z datumi s paketom lubridate

lubridate Morda najbolj priljubljen paket za delo z datumi v jeziku R. Ponuja vam tri dodatne razrede.

  • trajanja — trajanje, tj. število sekund med dvema časovnima žigoma;
  • obdobja - obdobja vam omogočajo izračune med datumi v človeku berljivih intervalih: dnevi, meseci, tedni itd.;
  • intervali - objekti, ki zagotavljajo začetno in končno točko v času.

Namestitev dodatnih paketov v jeziku R se izvaja s standardno funkcijo install.packages().

Namestitev paketa lubridate:

install.packages("lubridate")

Pretvorite besedilo v datum z lubridate

Lastnosti paketa lubridate znatno poenostavijo postopek pretvorbe besedila v datum in vam omogočajo tudi izvajanje vseh aritmetičnih operacij z datumi in časi.

Funkcije vam bodo pomagale pridobiti trenutni datum ali datum in uro today() и now().

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

Če želite pretvoriti niz 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 prek 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 Je veliko bolj učinkovit pri prepoznavanju opisov datumov kot besedila in vam omogoča pretvorbo besedila v datum brez uporabe dodatnih operaterjev za opis oblike.

Ekstrahiranje datljevih komponent z lubridate paketom

Tudi z uporabo lubridate lahko dobite katero koli komponento od datuma:

dt <- ymd("2017 jan 21")

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

Aritmetične operacije z datumi

Toda najpomembnejša in osnovna funkcionalnost lubridate je sposobnost izvajanja različnih aritmetičnih operacij z datumi.

Datumsko zaokroževanje izvajajo tri funkcije:

  • floor_date — zaokroževanje na najbližji preteklik
  • ceiling_date — zaokroževanje v bližnji prihodnji čas
  • round_date - zaokroževanje na najbližji čas

Vsaka od teh funkcij ima argument Enotaki vam omogoča, da določite enoto zaokroževanja: sekunda, minuta, ura, dan, teden, mesec, dva meseca, četrtletje, sezona, polletje, leto

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") # округлить до полугодия

Ugotovimo torej, kako dobiti datum, ki je 8 dni po trenutnem datumu, in naredimo različne druge aritmetične izračune med obema datumoma.

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

Poenostavljeno delo z obdobji, paket timeperiodsR.

timeperiodsR — svež paket za delo z datumi, ki je bil objavljen na CRAN septembra 2019.

Namestitev paketa timeperiodsR:

install.packages("timeperiodsR")

Glavni namen je hitro določiti določen časovni interval glede na določen datum. Na primer, z uporabo njegovih funkcij lahko enostavno:

  • Pridobite pretekli teden, mesec, četrtletje ali leto v R.
  • Pridobite določeno število časovnih intervalov glede na datum, na primer zadnje 4 tedne.
  • Iz nastalega časovnega intervala je enostavno izluščiti njegove komponente: začetni in končni datum, število dni, vključenih v interval, celotno zaporedje datumov, ki so vanj vključeni.

Ime vseh funkcij paketa timeperiodsR so intuitivni in sestavljeni iz dveh delov: smer_interval, kjer:

  • smer v katerem se morate premikati glede na dani datum: zadnji_n, prejšnji, ta, naslednji, naslednji_n.
  • časovno interval za izračun obdobja: dan, teden, mesec, četrtletje, leto.

Celoten nabor funkcij:

  • 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 časovnih obdobjihR

Te funkcije so uporabne v primerih, ko morate sestaviti poročila na podlagi podatkov iz preteklega tedna ali meseca. Za pridobitev zadnjega meseca uporabite istoimensko funkcijo previous_month():

prmonth <- previous_month()

Po tem boste imeli predmet prmonth Razred tpr, iz katerega je mogoče zlahka pridobiti naslednje komponente:

  • začetni datum obdobja, v našem primeru je to zadnji mesec
  • končni datum obdobja
  • število dni, vključenih v obdobje
  • zaporedje datumov, vključenih v obdobje

Poleg tega lahko vsako od komponent pridobite na različne načine:

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

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

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

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

Z argumentom lahko dobite tudi katero koli komponento del, ki je prisoten v vsaki od funkcij paketa. Možne vrednosti: začetek, konec, zaporedje, dolžina.

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

Oglejmo si torej vse argumente, ki so na voljo v funkcijah paketa timeperiodsR:

  • x — Referenčni datum, od katerega se bo izračunalo časovno obdobje, privzeto trenutni datum;
  • n — Število intervalov, ki bodo vključeni v obdobje, na primer prejšnje 3 tedne;
  • part — Katera sestavina predmeta tpr privzeto morate dobiti all;
  • week_start — Argument je prisoten samo v funkcijah za delo s tedni in vam omogoča nastavitev številke dneva v tednu, ki bo veljal za njegov začetek.Privzeto je začetek tedna ponedeljek, vendar lahko nastavite katero koli od 1 - ponedeljek do 7 - nedelja.

Tako lahko izračunate katero koli časovno obdobje glede na trenutni ali kateri koli drug dan; tukaj je še nekaj primerov:

# получить 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. oktober je nedelja:
Delo z datumi v R (osnovne zmogljivosti, kot tudi paketa lubridate in timeperiodsR)

Potrebujemo obdobje, ki bo glede na 6. oktober trajalo prejšnje 3 tedne. Brez tedna, ki vključuje sam 6. oktober. V skladu s tem je to obdobje od 9. septembra do 29. septembra.

Delo z datumi v R (osnovne zmogljivosti, kot tudi paketa lubridate in 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 tem primeru nas zanima mesec, ki je bil pred 4 meseci, če začnemo od 16. septembra 2019, je bil to maj 2019.

Filtriranje vektorja datumov z uporabo timeperiodsR

Za filtriranje datumov v timeperiodsR Obstaja več operaterjev:

  • %left_out% - primerja dva predmeta razreda tpr in vrne vrednost 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 predmeta razreda tpr in vrne vrednost desnega, ki manjka levemu.
  • %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   # получить даты из period1 которые входят в period2
period1 %left_out% period2  # получить даты из period1 которые не входят в period2
period1 %right_in% period2  # получить даты из period2 которые входят в period1
period1 %right_out% period2 # получить даты из period2 которые не входят в period1

Pri paketu timeperiodsR obstaja uradni, v ruskem jeziku YouTube seznam predvajanja.

Zaključek

Podrobno smo preučili razrede objektov, ki so zasnovani v jeziku R za delo z datumi. Zdaj lahko izvajate tudi aritmetične operacije na datumih in hitro pridobite poljubna časovna obdobja s pomočjo paketa timeperiodsR.

Če vas zanima jezik R, vas vabim, da se naročite na moj telegram kanal R4marketing, v katerem vsakodnevno delim koristne materiale o uporabi jezika R pri reševanju vaših vsakodnevnih težav.

Vir: www.habr.com

Dodaj komentar