Laborante kun datoj en R (bazaj kapabloj, same kiel la pakaĵoj lubridate kaj timeperiodsR)

Akiru la aktualan daton en iu ajn programlingvo, operacio ekvivalenta al "Saluton mondo!" La R-lingvo ne estas escepto.

En ĉi tiu artikolo, ni rigardos kiel labori kun datoj funkcias en la baza sintakso de la R-lingvo, kaj ankaŭ rigardos plurajn utilajn pakaĵojn, kiuj pligrandigas ĝiajn kapablojn kiam vi laboras kun datoj:

  • lubridate — pako, kiu ebligas al vi fari aritmetikajn kalkulojn inter datoj;
  • timeperiodsR — pako por labori kun tempintervaloj kaj iliaj komponantoj.

Laborante kun datoj en R (bazaj kapabloj, same kiel la pakaĵoj lubridate kaj timeperiodsR)

Enhavo

Se vi interesiĝas pri datuma analizo, kaj precipe pri la R-lingvo, eble vi interesiĝas pri mia telegramo и youtube kanaloj. Plejparto de la enhavo estas dediĉita al la R-lingvo.

  1. Laborante kun datoj en baza R-sintakso
    1.1. Konverti tekston al dato
    1.2. Ekstraktado de datkomponentoj en baza R
  2. Laborante kun datoj uzante la lubridan pakaĵon
    2.1. Konverti tekston al dato uzante lubridaton
    2.2. Eltiro de dato-komponentoj uzante la lubridan pakaĵon
    2.3. Aritmetikaj operacioj kun datoj
  3. Simpligita laboro kun periodoj, timeperiodsR-pakaĵo
    3.1. Tempintervaloj en tempoperiodojR
    3.2. Filtri vektoron de datoj uzante tempoperiodojnR
  4. konkludo

Laborante kun datoj en baza R-sintakso

Konverti tekston al dato

Baza R havas aron de funkcioj por labori kun datoj. La malavantaĝo de la baza sintakso estas ke la kazo de funkcionomoj kaj argumentoj estas tre disa kaj havas preskaŭ neniun logikan rilaton. Tamen vi bezonas koni la bazajn funkciojn de la lingvo, do ni komencos per ili.

Plej ofte dum ŝarĝo de datumoj en R, el csv-dosieroj aŭ aliaj fontoj, vi ricevas daton kiel tekston. Por konverti ĉi tiun tekston al la ĝusta datumtipo, uzu la funkcion 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"

defaŭlte as.Date() akceptas daton en du formatoj: JJYY-MM-JJYYYY/MM/DD.
Se via datumaro enhavas datojn en iu alia formato, vi povas uzi la argumenton format.

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

Formato akceptas operatorojn en ĉenformo indikante ajnan tempintervalon kaj ĝian formaton; la plej ofte uzataj valoroj estas montritaj en la suba tabelo:

Formato
Priskribo

%d
Taga nombro en monato

%a
Mallongigo por la nomo de la semajnotago

%A
Plena nomo de la semajnotago

%w
Nombro de la semajnotago (0-6, kie 0 estas dimanĉo)

%m
Ducifera monata nomo (01-12)

%b
Mallongigo de monata nomo (apr, mar, ...)

%B
Tutmonata nomo

%y
Ducifera jarnomo

%Y
Kvarcifera jarnomo

%j
Taga nombro en la jaro (001 - 366)

%U
Nombro de la semajno en la jaro (00 - 53), komenco de la semajno dimanĉo

%W
Semajna numero en la jaro (00 - 53), komenco de la semajno lundo

Sekve, "26-a de septembro 2019" estas la plena nomo de la monato, dato kaj jaro. Ĉi tiu datformato povas esti priskribita uzante funkciigistojn jene:"%B %d, %Y".

Kie:

  • %B — Plena nomo de la monato
  • %d — Nombro de la tago en la monato
  • %Y — Kvarcifera jarnomo

Kiam vi priskribas la datformaton, gravas inkluzivi ĉiujn kromajn signojn el via ĉeno, kiel streketoj, komoj, punktoj, spacoj ktp. En mia ekzemplo, "26-a de septembro 2019", estas komo post la dato, kaj vi ankaŭ devas meti komon en la formatpriskribon:"%B %d, %Y".

Estas situacioj, kiam vi ricevas daton, kiu ne nur ne respondas al normaj formatoj (YYYY-MM-DD aŭ YYYY/MM/DD), sed ankaŭ en lingvo kiu diferencas de la defaŭlta instalita en via operaciumo. Ekzemple, vi elŝutis datumojn, kie la dato estas indikita jene: "15-a de decembro 2019." Antaŭ ol konverti ĉi tiun ĉenon al dato, vi devas ŝanĝi la lokaĵon.

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

Ekstraktado de datkomponentoj en baza R

Ne estas multaj funkcioj en baza R, kiuj ebligas al vi ĉerpi ajnan parton de dato el klasa objekto Dato.

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

Krom la ĉefa objektoklaso Dato en baza R ekzistas 2 pliaj datumtipoj, kiuj konservas tempomarkon: POSIXlt, POSIXct. La ĉefa diferenco inter ĉi tiuj klasoj kaj Dato estas ke krom la dato ili konservas tempon.

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

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

# "POSIXct" "POSIXt"

funkcio Sys.time() resendas la aktualan daton kaj horon en la formato POSIXct. Ĉi tiu formato estas simila en signifo al UNIXTIME, kaj konservas la nombron da sekundoj ekde la komenco de la UNIX-epoko (noktomezo (UTC) de la 31-a de decembro 1969 ĝis la 1-a de januaro 1970).

Класс POSIXlt ĝi ankaŭ konservas la tempon kaj daton, kaj ĉiujn iliajn komponentojn. Sekve, ĝi estas objekto kun pli kompleksa strukturo, sed de kiu estas facile akiri ajnan daton kaj tempokomponenton ĉar fakte POSIXlt ĝi listo.

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

Konvertado de nombraj kaj tekstaj datumoj al formatoj POSIX* plenumita de funkcioj as.POSIXct() и as.POSIXlt(). Ĉi tiuj funkcioj havas malgrandan aron da argumentoj.

  • x — Nombra, ĉeno aŭ klasa objekto Dato, kiu devas esti konvertita;
  • tz — Horzono, defaŭlta "GMT";
  • format — Priskribo de la datformato en kiu la datumoj pasigitaj al la x-argumento estas reprezentitaj;
  • origino — Uzita nur dum konverto de nombro al POSIX; vi devas pasi daton kaj tempon de kiuj la sekundoj estas kalkulitaj al ĉi tiu argumento. Kutime uzata por tradukado de UNIXTIME.

Se viaj informoj pri dato kaj horo estas en UNIXTIME, tiam por konverti ilin en klaran, legeblan daton, uzu la sekvan ekzemplon:

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

En origino vi povas specifi ajnan tempomarkon. Ekzemple, se viaj datumoj enhavas la daton kaj horon kiel la nombro da sekundoj ekde la 15-a de septembro 2019 12:15, tiam por konverti ĝin al dato uzo:

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

Laborante kun datoj uzante la lubridan pakaĵon

lubridate Eble la plej populara pako por labori kun datoj en la lingvo R. Ĝi provizas al vi tri pliajn klasojn.

  • daŭroj — daŭro, t.e. nombro da sekundoj inter du tempomarkoj;
  • periodoj - periodoj permesas fari kalkulojn inter datoj en homlegeblaj intervaloj: tagoj, monatoj, semajnoj ktp;
  • intervaloj - objektoj kiuj disponigas la komencan kaj finpunkton en tempo.

Instalado de pliaj pakaĵoj en la R-lingvo estas farita per la norma funkcio install.packages().

Instalante la pakaĵon lubridate:

install.packages("lubridate")

Konverti tekston al dato uzante lubridaton

Pakaj trajtoj lubridate signife simpligu la procezon konverti tekston en daton, kaj ankaŭ ebligas al vi fari ajnajn aritmetikajn operaciojn kun datoj kaj horoj.

La funkcioj helpos vin akiri la aktualan daton aŭ daton kaj horon today() и now().

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

Por konverti ŝnuron al dato en lubridate Estas tuta familio de funkcioj, kies nomoj ĉiam konsistas el tri literoj, kaj indikas la sinsekvon de datkomponentoj:

  • y - jaro
  • m - monato
  • d - tago

Listo de funkcioj por konverti tekston ĝis nun per lubridate

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

Kelkaj ekzemploj por konverti ŝnurojn al datoj:

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

Kiel vi povas vidi lubridate Ĝi estas multe pli efika por rekoni datajn priskribojn kiel tekston, kaj permesas vin konverti tekston al dato sen uzi pliajn funkciigistojn por priskribi la formaton.

Eltiro de dato-komponentoj uzante la lubridan pakaĵon

Ankaŭ uzante lubridate vi povas akiri ajnan komponanton de dato:

dt <- ymd("2017 jan 21")

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

Aritmetikaj operacioj kun datoj

Sed la plej grava kaj baza funkcio lubridate estas la kapablo fari diversajn aritmetikajn operaciojn kun datoj.

Dato-rondado estas farita per tri funkcioj:

  • floor_date — rondigante al la plej proksima pasinta tempo
  • ceiling_date — rondigo al la proksima estonteco
  • round_date - rondigo al la plej proksima tempo

Ĉiu el ĉi tiuj funkcioj havas argumenton unuokiu permesas specifi la rondigan unuon: sekundo, minuto, horo, tago, semajno, monato, dumonato, kvarono, sezono, duonjaro, jaro

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

Do ni eltrovu kiel akiri daton kiu estas 8 tagojn post la nuna dato kaj faru diversajn aliajn aritmetikajn kalkulojn inter la du datoj.

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

Simpligita laboro kun periodoj, timeperiodsR-pakaĵo.

timeperiodsR — freŝa pako por labori kun datoj, kiu estis publikigita ĉe CRAN en septembro 2019.

Instalante la pakaĵon timeperiodsR:

install.packages("timeperiodsR")

La ĉefa celo estas rapide determini certan tempintervalon rilate al donita dato. Ekzemple, uzante ĝiajn funkciojn vi povas facile:

  • Akiru la pasintan semajnon, monaton, kvaronon aŭ jaron en R.
  • Akiru specifan nombron da tempointervaloj rilate al dato, ekzemple la pasintajn 4 semajnojn.
  • Estas facile ĉerpi ĝiajn komponantojn el la rezulta tempointervalo: la komenco kaj findato, la nombro da tagoj inkluzivitaj en la intervalo, la tuta sekvenco de datoj kiuj estas inkluditaj en ĝi.

Nomo de ĉiuj pakaj funkcioj timeperiodsR estas intuiciaj kaj konsistas el du partoj: direkto_intervalo, kie:

  • direkto en kiu vi devas moviĝi relative al donita dato: last_n, antaŭa, ĉi, sekva, sekva_n.
  • tempa intervalo por kalkuli la periodon: tago, semajno, monato, kvarono, jaro.

Plena aro de funkcioj:

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

Tempintervaloj en tempoperiodojR

Ĉi tiuj funkcioj estas utilaj en kazoj kie vi bezonas konstrui raportojn bazitajn sur datumoj de la pasinta semajno aŭ monato. Por akiri la lastan monaton, uzu la samnoman funkcion previous_month():

prmonth <- previous_month()

Post kio vi havos objekton antaŭmonato klaso tpr, de kiu la sekvaj komponantoj povas esti facile akiritaj:

  • la komenca dato de la periodo, en nia ekzemplo ĉi tio estas la lasta monato
  • periodo findato
  • nombro da tagoj inkluzivitaj en la periodo
  • sekvenco de datoj inkluzivitaj en la periodo

Krome, vi povas akiri ĉiun el la komponantoj en malsamaj manieroj:

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

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

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

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

Vi ankaŭ povas akiri iun el la komponantoj uzante la argumenton parto, kiu ĉeestas en ĉiu el la pakaĵfunkcioj. Eblaj valoroj: komenco, fino, sinsekvo, longo.

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

Do ni rigardu ĉiujn argumentojn disponeblajn en la pakaj funkcioj timeperiodsR:

  • x — La referenca dato de kiu la tempoperiodo estos kalkulita, la aktuala dato defaŭlte;
  • n — La nombro da intervaloj kiuj estos inkluzivitaj en la periodo, ekzemple la antaŭajn 3 semajnojn;
  • part — Kiu komponanto de la objekto tpr vi devas akiri, defaŭlte all;
  • week_start — La argumento ĉeestas nur en funkcioj por labori kun semajnoj, kaj permesas al vi agordi la nombron de la semajnotago, kiu estos konsiderata ĝia komenco. Defaŭlte, la komenco de la semajno estas lundo, sed vi povas agordi ajnan de 1 - lundo ĝis 7 - dimanĉo.

Tiel, vi povas kalkuli ajnan periodon rilate al la nuna aŭ ajna alia donita dato; jen kelkaj pliaj ekzemploj:

# получить 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

La 6-a de oktobro estas dimanĉo:
Laborante kun datoj en R (bazaj kapabloj, same kiel la pakaĵoj lubridate kaj timeperiodsR)

Ni bezonas periodon kiu, rilate al oktobro 6, daŭros la antaŭajn 3 semajnojn. Ne inkluzive de la semajno kiu inkluzivas la 6-an de oktobro mem. Sekve, ĉi tiu estas la periodo de la 9-a ĝis la 29-a de septembro.

Laborante kun datoj en R (bazaj kapabloj, same kiel la pakaĵoj lubridate kaj 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

En ĉi tiu ekzemplo, ni interesiĝas pri la monato, kiu estis antaŭ 4 monatoj, se ni komencas de la 16-a de septembro 2019, tiam ĝi estis majo 2019.

Filtri vektoron de datoj uzante tempoperiodojnR

Por filtri datojn en timeperiodsR Estas pluraj funkciigistoj:

  • %left_out% - komparas du tpr klasobjektojn, kaj redonas la valoron de la maldekstra, kiu mankas en la dekstra.
  • %left_in% - komparas du objektojn de la tpr-klaso, kaj resendas la datojn de la maldekstra objekto, kiuj estas inkluzivitaj en la dekstra.
  • %right_out% - komparas du tpr klasobjektojn, kaj resendas la valoron de la dekstra kiu mankas de la maldekstra.
  • %right_in% - komparas du objektojn de la tpr-klaso, kaj liveras datojn de la dekstra objekto, kiuj ĉeestas en la maldekstra.

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

Ĉe la pako timeperiodsR ekzistas oficiala, ruslingva Jutuba ludlisto.

konkludo

Ni detale ekzamenis la klasojn de objektoj desegnitaj en la R-lingvo por labori kun datoj. Ankaŭ nun vi povas fari aritmetikajn operaciojn en datoj, kaj rapide akiri ajnajn tempoperiodojn uzante la pakaĵon timeperiodsR.

Se vi interesiĝas pri la R-lingvo, mi invitas vin aboni mian telegraman kanalon R4merkatado, en kiu mi ĉiutage dividas utilajn materialojn pri uzado de la R-lingvo por solvado de viaj ĉiutagaj problemoj.

fonto: www.habr.com

Aldoni komenton