Darbs ar datumiem R (pamata iespējas, kā arī eļļošanas un timeperiodsR pakotnes)

Iegūstiet pašreizējo datumu jebkurā programmēšanas valodā, kas ir līdzvērtīga darbībai "Sveika pasaule!" R valoda nav izņēmums.

Šajā rakstā mēs apskatīsim, kā darbs ar datumiem darbojas R valodas pamata sintaksē, kā arī apskatīsim vairākas noderīgas pakotnes, kas paplašina tās iespējas, strādājot ar datumiem:

  • lubridate — pakete, kas ļauj veikt aritmētiskos aprēķinus starp datumiem;
  • timeperiodsR — pakete darbam ar laika intervāliem un to sastāvdaļām.

Darbs ar datumiem R (pamata iespējas, kā arī eļļošanas un timeperiodsR pakotnes)

saturs

Ja jūs interesē datu analīze un jo īpaši R valoda, jūs varētu interesēt mana telegramma и youtube kanāliem. Lielākā daļa satura ir veltīta R valodai.

  1. Darbs ar datumiem pamata R sintaksē
    1.1. Konvertēt tekstu uz datumu
    1.2. Datuma komponentu izvilkšana pamata R
  2. Darbs ar datumiem, izmantojot smērvielas iepakojumu
    2.1. Konvertējiet tekstu uz datumu, izmantojot eļļošanu
    2.2. Datuma komponentu ekstrakcija, izmantojot eļļošanas iepakojumu
    2.3. Aritmētiskās darbības ar datumiem
  3. Vienkāršots darbs ar periodiem, timeperiodsR pakotni
    3.1. Laika intervāli laika periodosR
    3.2. Datumu vektora filtrēšana, izmantojot laika periodusR
  4. Secinājums

Darbs ar datumiem pamata R sintaksē

Konvertēt tekstu uz datumu

Basic R ir virkne funkciju darbam ar datumiem. Pamata sintakses trūkums ir tas, ka funkciju nosaukumu un argumentu gadījums ir ļoti izkliedēts un tam praktiski nav loģiskas saiknes. Tomēr jums ir jāzina valodas pamatfunkcijas, tāpēc mēs sāksim ar tām.

Visbiežāk, ielādējot datus R, no csv failiem vai citiem avotiem, datums tiek saņemts kā teksts. Lai pārvērstu šo tekstu pareizajā datu tipā, izmantojiet funkciju 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"

Pēc noklusējuma as.Date() pieņem datumu divos formātos: GGGG-MM-DD vai GGGG/MM/DD.
Ja jūsu datu kopā ir datumi citā formātā, varat izmantot argumentu format.

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

formāts pieņem operatorus virknes formā, kas apzīmē jebkuru laika intervālu un tā formātu; visbiežāk izmantotās vērtības ir parādītas tabulā:

Formāts
Apraksts

%d
Dienas numurs mēnesī

%a
Nedēļas dienas nosaukuma saīsinājums

%A
Nedēļas dienas pilns nosaukums

%w
Nedēļas dienas numurs (0-6, kur 0 ir svētdiena)

%m
Divciparu mēneša apzīmējums (01-12)

%b
Mēneša nosaukuma saīsinājums (apr, mar, …)

%B
Pilns mēneša nosaukums

%y
Divciparu gada apzīmējums

%Y
Četrciparu gada apzīmējums

%j
Dienas numurs gadā (001 - 366)

%U
Nedēļas numurs gadā (00 - 53), nedēļas sākums svētdiena

%W
Nedēļas numurs gadā (00 - 53), nedēļas sākums pirmdiena

Attiecīgi “26. gada 2019. septembris” ir mēneša, datuma un gada pilns nosaukums. Šo datuma formātu var aprakstīt, izmantojot operatorus šādi:"%B %d, %Y".

Kur:

  • %B — Mēneša pilns nosaukums
  • %d — Dienas numurs mēnesī
  • %Y — Četrciparu gada apzīmējums

Aprakstot datuma formātu, ir svarīgi iekļaut visas papildu rakstzīmes no virknes, piemēram, domuzīmes, komatus, punktus, atstarpes utt. Manā piemērā “26. gada 2019. septembris” aiz datuma ir komats, kā arī formāta aprakstā ir jāliek komats:"%B %d, %Y".

Ir situācijas, kad saņemat datumu, kas ne tikai neatbilst standarta formātiem (GGGG-MM-DD vai GGGG/MM/DD), bet arī valodā, kas atšķiras no jūsu operētājsistēmā instalētās noklusējuma valodas. Piemēram, jūs lejupielādējāt datus, kur datums ir norādīts šādi: “15. gada 2019. decembris”. Pirms šīs virknes konvertēšanas par datumu, jums ir jāmaina lokalizācija.

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

Datuma komponentu izvilkšana pamata R

Pamatprogrammā R nav daudz funkciju, kas ļauj iegūt jebkuru datuma daļu no klases objekta datums.

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

Papildus galvenajai objektu klasei datums pamata R ir vēl 2 datu veidi, kas saglabā laikspiedolu: POSIXlt, POSIXct. Galvenā atšķirība starp šīm klasēm un datums ir tas, ka papildus datumam viņi saglabā laiku.

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

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

# "POSIXct" "POSIXt"

Funkcija Sys.time() atgriež pašreizējo datumu un laiku formātā POSIXct. Šis formāts pēc nozīmes ir līdzīgs UNIXTIME, un saglabā sekunžu skaitu kopš UNIX laikmeta sākuma (pusnakts (UTC) no 31. gada 1969. decembra līdz 1. gada 1970. janvārim).

Klase POSIXlt tajā tiek saglabāts arī laiks un datums, kā arī visi to komponenti. Tāpēc tas ir objekts ar sarežģītāku struktūru, bet no kura ir viegli iegūt jebkuru datuma un laika komponentu, jo patiesībā POSIXlt šis saraksts.

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

Ciparu un teksta datu konvertēšana formātos POSIX* veic funkcijas as.POSIXct() и as.POSIXlt(). Šīm funkcijām ir neliels argumentu kopums.

  • x — numurs, virkne vai klases objekts datums, kas ir jāpārveido;
  • tz — laika josla, noklusējuma "GMT";
  • format — datuma formāta apraksts, kurā tiek attēloti argumentam x nodotie dati;
  • izcelsme — tiek izmantots tikai, pārvēršot skaitli uz POSIX; jums ir jānodod datuma objekts un laiks, no kura šajā argumentā tiek ieskaitītas sekundes. Parasti izmanto tulkošanai no UNIXTIME.

Ja jūsu datuma un laika informācija ir ievadīta UNIXTIME, pēc tam, lai pārvērstu tos skaidrā, salasāmā datumā, izmantojiet šādu piemēru:

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

Izcelsmē varat norādīt jebkuru laikspiedolu. Piemēram, ja jūsu datos ir norādīts datums un laiks kā sekunžu skaits kopš 15. gada 2019. septembra plkst. 12:15, lai tos pārvērstu datumā, izmantojiet:

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

Darbs ar datumiem, izmantojot smērvielas iepakojumu

lubridate Iespējams, vispopulārākā pakotne darbam ar datumiem R valodā, kas nodrošina trīs papildu nodarbības.

  • ilgumi — ilgums, t.i. sekunžu skaits starp diviem laikspiedoliem;
  • periodi — periodi ļauj veikt aprēķinus starp datumiem cilvēkam lasāmos intervālos: dienas, mēneši, nedēļas utt.;
  • intervāli - objekti, kas nodrošina sākuma un beigu punktu laikā.

Papildu pakotņu instalēšana R valodā tiek veikta, izmantojot standarta funkciju install.packages().

Pakotnes instalēšana lubridate:

install.packages("lubridate")

Konvertējiet tekstu uz datumu, izmantojot eļļošanu

Pakas funkcijas lubridate ievērojami vienkāršo teksta konvertēšanas procesu datumā, kā arī ļauj veikt jebkādas aritmētiskās darbības ar datumiem un laikiem.

Funkcijas palīdzēs iegūt pašreizējo datumu vai datumu un laiku today() и now().

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

Lai pārvērstu virkni par datumu lubridate Ir vesela funkciju saime, kuru nosaukumi vienmēr sastāv no trim burtiem un norāda datuma komponentu secību:

  • y — gads
  • m - mēnesis
  • d - diena

Funkciju saraksts teksta konvertēšanai datumā, izmantojot eļļošanu

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

Daži piemēri virkņu pārvēršanai datumos:

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

Kā tu redzi lubridate Tas ir daudz efektīvāk atpazīt datumu aprakstus kā tekstu un ļauj konvertēt tekstu par datumu, neizmantojot papildu operatorus, lai aprakstītu formātu.

Datuma komponentu ekstrakcija, izmantojot eļļošanas iepakojumu

Arī izmantojot lubridate jūs varat iegūt jebkuru komponentu no datuma:

dt <- ymd("2017 jan 21")

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

Aritmētiskās darbības ar datumiem

Bet vissvarīgākā un pamata funkcionalitāte lubridate ir spēja veikt dažādas aritmētiskas darbības ar datumiem.

Datuma noapaļošanu veic trīs funkcijas:

  • floor_date — noapaļojot līdz tuvākajam pagātnes laikam
  • ceiling_date — noapaļošana līdz tuvākajam laikam
  • round_date - noapaļošana līdz tuvākajam laikam

Katrai no šīm funkcijām ir arguments vienībakas ļauj norādīt noapaļošanas vienību: sekunde, minūte, stunda, diena, nedēļa, mēnesis, divmēnesis, ceturksnis, sezona, pusgads, gads

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

Tātad, izdomāsim, kā iegūt datumu, kas ir 8 dienas pēc pašreizējā datuma, un veiksim dažādus citus aritmētiskus aprēķinus starp šiem diviem datumiem.

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

Vienkāršots darbs ar periodiem, timeperiodsR pakotni.

timeperiodsR — jauna pakotne darbam ar datumiem, kas tika publicēta CRAN 2019. gada septembrī.

Pakotnes instalēšana timeperiodsR:

install.packages("timeperiodsR")

Galvenais mērķis ir ātri noteikt noteiktu laika intervālu attiecībā pret konkrēto datumu. Piemēram, izmantojot tās funkcijas, jūs varat viegli:

  • Iegūstiet pēdējo nedēļu, mēnesi, ceturksni vai gadu R.
  • Iegūstiet noteiktu laika intervālu skaitu attiecībā pret datumu, piemēram, pēdējās 4 nedēļas.
  • No iegūtā laika intervāla ir viegli iegūt tā sastāvdaļas: sākuma un beigu datumu, intervālā iekļauto dienu skaitu, visu tajā iekļauto datumu secību.

Visu pakotnes funkciju nosaukums timeperiodsR ir intuitīvi un sastāv no divām daļām: virziens_intervāls, kur:

  • virziens kurā jums jāpārvietojas attiecībā pret noteiktu datumu: pēdējais_n, iepriekšējais, šis, nākamais, nākamais_n.
  • īslaicīgs intervāls lai aprēķinātu periodu: diena, nedēļa, mēnesis, ceturksnis, gads.

Pilns funkciju komplekts:

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

Laika intervāli laika periodosR

Šīs funkcijas ir noderīgas gadījumos, kad jums ir jāizveido atskaites, pamatojoties uz pagājušās nedēļas vai mēneša datiem. Lai iegūtu pēdējo mēnesi, izmantojiet tāda paša nosaukuma funkciju previous_month():

prmonth <- previous_month()

Pēc tam jums būs objekts Prmonth klase tpr, no kura var viegli iegūt šādas sastāvdaļas:

  • perioda sākuma datums, mūsu piemērā tas ir pēdējais mēnesis
  • perioda beigu datums
  • periodā iekļauto dienu skaits
  • periodā iekļauto datumu secība

Turklāt jūs varat iegūt katru no komponentiem dažādos veidos:

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

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

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

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

Varat arī iegūt jebkuru no komponentiem, izmantojot argumentu daļa, kas atrodas katrā no pakotnes funkcijām. Iespējamās vērtības: sākums, beigas, secība, garums.

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

Tāpēc apskatīsim visus pakotnes funkcijās pieejamos argumentus timeperiodsR:

  • x — atsauces datums, no kura tiks aprēķināts laika periods, pašreizējais datums pēc noklusējuma;
  • n — intervālu skaits, kas tiks iekļauts periodā, piemēram, iepriekšējās 3 nedēļas;
  • part — Kura objekta sastāvdaļa tpr jums ir jāiegūst pēc noklusējuma all;
  • week_start — Arguments ir pieejams tikai funkcijās darbam ar nedēļām un ļauj iestatīt nedēļas dienas numuru, kas tiks uzskatīts par tās sākumu. Pēc noklusējuma nedēļas sākums ir pirmdiena, bet jūs varat iestatīt jebkuru no plkst. 1 - no pirmdienas līdz 7 - svētdienai.

Tādējādi jūs varat aprēķināt jebkuru laika periodu attiecībā pret pašreizējo vai jebkuru citu norādīto datumu; šeit ir vēl daži piemēri:

# получить 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. oktobris ir svētdiena:
Darbs ar datumiem R (pamata iespējas, kā arī eļļošanas un timeperiodsR pakotnes)

Mums ir nepieciešams periods, kas, salīdzinot ar 6. oktobri, aizņems iepriekšējās 3 nedēļas. Neskaitot nedēļu, kurā ietilpst pats 6. oktobris. Attiecīgi šis ir laika posms no 9. septembra līdz 29. septembrim.

Darbs ar datumiem R (pamata iespējas, kā arī eļļošanas un timeperiodsR pakotnes)

# получить месяц отстающий на 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

Šajā piemērā mūs interesē mēnesis, kas bija pirms 4 mēnešiem, ja mēs sākam no 16. gada 2019. septembra, tad tas bija 2019. gada maijs.

Datumu vektora filtrēšana, izmantojot laika periodusR

Lai filtrētu datumus timeperiodsR Ir vairāki operatori:

  • %left_out% — salīdzina divus tpr klases objektus un atgriež vērtību no kreisās puses, kuras trūkst labajā.
  • %left_in% - salīdzina divus tpr klases objektus un atgriež datumus no kreisā objekta, kas ir iekļauti labajā.
  • %right_out% - salīdzina divus tpr klases objektus un atgriež vērtību no labā objekta, kas trūkst kreisajā pusē.
  • %right_in% - salīdzina divus tpr klases objektus un atgriež datumus no labā objekta, kas atrodas kreisajā objektā.

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

Pie iepakojuma timeperiodsR ir oficiāla, krievu valodā YouTube atskaņošanas saraksts.

Secinājums

Mēs detalizēti izskatījām objektu klases, kas izstrādātas R valodā darbam ar datumiem. Arī tagad jūs varat veikt aritmētiskās darbības ar datumiem un ātri iegūt jebkuru laika periodu, izmantojot paketi timeperiodsR.

Ja jūs interesē R valoda, aicinu abonēt manu telegrammas kanālu R4 mārketings, kurā ikdienā dalos ar noderīgiem materiāliem par R valodas lietošanu savu ikdienas problēmu risināšanā.

Avots: www.habr.com

Pievieno komentāru