R-da sanalar bilan ishlash (asosiy imkoniyatlar, shuningdek, moylash va vaqt oralig'iR paketlari)

Joriy sanani istalgan dasturlash tilida, “Salom dunyo!” ga ekvivalent operatsiyani oling. R tili ham bundan mustasno emas.

Ushbu maqolada biz R tilining asosiy sintaksisida sanalar bilan ishlash qanday ishlashini ko'rib chiqamiz, shuningdek, sanalar bilan ishlashda uning imkoniyatlarini kengaytiradigan bir nechta foydali paketlarni ko'rib chiqamiz:

  • lubridate — sanalar orasida arifmetik hisob-kitoblarni amalga oshirish imkonini beruvchi paket;
  • timeperiodsR — vaqt oraliqlari va ularning komponentlari bilan ishlash paketi.

R-da sanalar bilan ishlash (asosiy imkoniyatlar, shuningdek, moylash va vaqt oralig'iR paketlari)

Mundarija

Agar siz ma'lumotlar tahliliga, xususan, R tiliga qiziqsangiz, meni qiziqtirishi mumkin telegramma и youtube kanallar. Kontentning katta qismi R tiliga bag'ishlangan.

  1. Asosiy R sintaksisida sanalar bilan ishlash
    1.1. Matnni sanaga aylantiring
    1.2. Asosiy R-da sana komponentlarini ajratib olish
  2. lubridate paketi yordamida sanalar bilan ishlash
    2.1. lubridate yordamida matnni sanaga aylantiring
    2.2. lubridate paketi yordamida sana komponentlarini ajratib olish
    2.3. Sanalar bilan arifmetik amallar
  3. Davrlar bilan soddalashtirilgan ish, timeperiodsR paketi
    3.1. Vaqt davrlaridagi vaqt intervallariR
    3.2. timeperiodsR yordamida sanalar vektorini filtrlash
  4. xulosa

Asosiy R sintaksisida sanalar bilan ishlash

Matnni sanaga aylantiring

Basic R sanalar bilan ishlash uchun funktsiyalar to'plamiga ega. Asosiy sintaksisning kamchiligi shundaki, funksiya nomlari va argumentlar holi juda tarqoq va amalda mantiqiy aloqaga ega emas. Biroq, siz tilning asosiy funktsiyalarini bilishingiz kerak, shuning uchun biz ulardan boshlaymiz.

Ko'pincha R-ga, csv-fayllardan yoki boshqa manbalardan ma'lumotlarni yuklashda siz matn sifatida sanani olasiz. Ushbu matnni to'g'ri ma'lumot turiga aylantirish uchun funksiyadan foydalaning 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"

sukut as.Date() sanani ikki formatda qabul qiladi: YYYY-AA-KK yoki YYYY/MM/KK.
Agar ma'lumotlar to'plamida boshqa formatdagi sanalar bo'lsa, siz argumentdan foydalanishingiz mumkin format.

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

format operatorlarni har qanday vaqt oralig'ini va uning formatini bildiruvchi satr shaklida qabul qiladi; eng ko'p ishlatiladigan qiymatlar quyidagi jadvalda ko'rsatilgan:

Formatlash
tavsifi

%d
Oydagi kun soni

%a
Hafta kuni nomining qisqartmasi

%A
Hafta kunining to'liq nomi

%w
Hafta kunining soni (0-6, bu erda 0 yakshanba)

%m
Ikki xonali oy belgisi (01-12)

%b
Oy nomining qisqartmasi (apr, mart, …)

%B
To'liq oy nomi

%y
Ikki xonali yil belgisi

%Y
To'rt xonali yil belgisi

%j
Yildagi kun raqami (001 - 366)

%U
Yildagi hafta soni (00 - 53), haftaning boshi yakshanba

%W
Yildagi hafta raqami (00 - 53), haftaning boshi dushanba

Shunga ko'ra, "26 yil 2019 sentyabr" - oy, sana va yilning to'liq nomi. Ushbu sana formatini operatorlar yordamida quyidagicha tasvirlash mumkin:"%B %d, %Y".

Qaerda:

  • %B - Oyning to'liq nomi
  • %d - Oydagi kun soni
  • %Y - To'rt xonali yil belgisi

Sana formatini tavsiflashda qatoringizdagi barcha qo'shimcha belgilarni, masalan, tire, vergul, nuqta, bo'shliq va hokazolarni kiritish muhimdir. Mening misolimda, "26 yil 2019 sentyabr" sanadan keyin vergul qo'yiladi va format tavsifiga vergul qo'yish kerak:"%B %d, %Y".

Siz nafaqat standart formatlarga mos kelmaydigan sanani olgan holatlar mavjud (YYYY-AA-KK yoki YYYY/MM/KK), balki operatsion tizimingizda o'rnatilgan standart tildan farq qiladigan tilda ham. Masalan, siz ma'lumotlarni yuklab oldingiz, unda sana quyidagicha ko'rsatilgan: "15 yil 2019 dekabr." Ushbu satrni sanaga aylantirishdan oldin, siz mahalliy tilni o'zgartirishingiz kerak.

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

Asosiy R-da sana komponentlarini ajratib olish

Asosiy R-da sinf ob'ektidan sananing istalgan qismini ajratib olish imkonini beruvchi funksiyalar ko'p emas sana.

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

Asosiy ob'ekt sinfiga qo'shimcha ravishda sana asosiy R da vaqt tamg'asini saqlaydigan yana ikkita ma'lumot turi mavjud: POSIXlt, POSIXct. Bu sinflar o'rtasidagi asosiy farq va sana ular vaqtni saqlaydigan sanadan tashqari.

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

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

# "POSIXct" "POSIXt"

vazifa Sys.time() joriy sana va vaqtni formatda qaytaradi POSIXct. Ushbu format ma'no jihatidan o'xshash UNIXTIME, va UNIX davri boshidan buyon soniyalar sonini saqlaydi (31 yil 1969 dekabrdan 1 yil 1970 yanvargacha yarim tun (UTC)).

sinf POSIXlt u vaqt va sanani hamda ularning barcha komponentlarini ham saqlaydi. Shuning uchun, u murakkabroq tuzilishga ega bo'lgan ob'ektdir, lekin undan har qanday sana va vaqt komponentini olish oson, chunki aslida POSIXlt u ro'yxat.

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

Raqamli va matnli ma'lumotlarni formatlarga aylantirish POSIX* funktsiyalari orqali amalga oshiriladi as.POSIXct() и as.POSIXlt(). Bu funktsiyalar kichik argumentlar to'plamiga ega.

  • x - Raqam, satr yoki sinf ob'ekti sana, konvertatsiya qilinishi kerak bo'lgan;
  • tz — Vaqt mintaqasi, standart "GMT";
  • format — x argumentiga uzatilgan ma'lumotlar taqdim etiladigan sana formatining tavsifi;
  • kelib chiqish — faqat raqamni POSIX ga o‘tkazishda foydalaniladi; bu argumentga soniyalar sanaladigan sana ob’ekti va vaqtini o‘tkazish kerak. Odatda UNIXTIME dan tarjima qilish uchun ishlatiladi.

Agar sizning sana va vaqtingiz ma'lumotlari bo'lsa UNIXTIME, keyin ularni aniq, o'qilishi mumkin bo'lgan sanaga aylantirish uchun quyidagi misoldan foydalaning:

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

Asl nusxada siz istalgan vaqt tamg'asini belgilashingiz mumkin. Masalan, agar maʼlumotlaringizda 15-yil 2019-sentabr 12:15 dan boshlab soniyalar soni sifatida sana va vaqt boʻlsa, uni sanaga aylantirish uchun:

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

lubridate paketi yordamida sanalar bilan ishlash

lubridate Ehtimol, R tilida sanalar bilan ishlash uchun eng mashhur paket. U sizga uchta qo'shimcha darsni taqdim etadi.

  • muddatlar - davomiylik, ya'ni. ikki vaqt belgilari orasidagi soniyalar soni;
  • davrlar - davrlar sanalar o'rtasida odam o'qiy oladigan vaqt oralig'ida hisob-kitoblarni amalga oshirish imkonini beradi: kunlar, oylar, haftalar va boshqalar;
  • intervallar - vaqtning boshlang'ich va tugash nuqtasini ta'minlovchi ob'ektlar.

R tilida qo'shimcha paketlarni o'rnatish standart funksiya yordamida amalga oshiriladi install.packages().

Paketni o'rnatish lubridate:

install.packages("lubridate")

lubridate yordamida matnni sanaga aylantiring

Paket xususiyatlari lubridate matnni sanaga aylantirish jarayonini sezilarli darajada soddalashtirish, shuningdek, sana va vaqtlar bilan har qanday arifmetik amallarni bajarishga imkon beradi.

Funktsiyalar joriy sana yoki sana va vaqtni olishga yordam beradi today() и now().

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

Satrni sanaga aylantirish uchun lubridate Nomlari har doim uchta harfdan iborat bo'lgan va sana komponentlari ketma-ketligini ko'rsatadigan butun funktsiyalar oilasi mavjud:

  • y - yil
  • m - oy
  • d - kun

Matnni lubridate orqali sanaga aylantirish uchun funktsiyalar ro'yxati

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

Satrlarni sanaga aylantirish uchun ba'zi misollar:

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

Ko'rib turganingizdek lubridate Bu sana tavsiflarini matn sifatida tanib olishda ancha samarali va formatni tavsiflash uchun qo'shimcha operatorlardan foydalanmasdan matnni sanaga aylantirish imkonini beradi.

lubridate paketi yordamida sana komponentlarini ajratib olish

Bundan tashqari, foydalanish lubridate sanadan istalgan komponentni olishingiz mumkin:

dt <- ymd("2017 jan 21")

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

Sanalar bilan arifmetik amallar

Lekin eng muhim va asosiy funksionallik lubridate sanalar bilan turli arifmetik amallarni bajarish qobiliyatidir.

Sanalarni yaxlitlash uchta funktsiya tomonidan amalga oshiriladi:

  • floor_date — eng yaqin o‘tgan zamonga yaxlitlash
  • ceiling_date — yaqin kelasi zamonga yaxlitlash
  • round_date - eng yaqin vaqtga yaxlitlash

Bu funksiyalarning har biri argumentga ega birlikyaxlitlash birligini belgilash imkonini beradi: soniya, daqiqa, soat, kun, hafta, oy, ikki oy, chorak, mavsum, yarim yil, yil

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

Shunday qilib, keling, joriy sanadan 8 kun o'tgan sanani qanday olish mumkinligini aniqlaymiz va ikki sana o'rtasida boshqa turli arifmetik hisob-kitoblarni bajaramiz.

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

Davrlar bilan soddalashtirilgan ish, timeperiodsR paketi.

timeperiodsR — 2019-yil sentabr oyida CRAN-da chop etilgan sanalar bilan ishlash uchun yangi paket.

Paketni o'rnatish timeperiodsR:

install.packages("timeperiodsR")

Asosiy maqsad ma'lum bir sanaga nisbatan ma'lum vaqt oralig'ini tezda aniqlashdir. Masalan, uning funktsiyalaridan foydalanib, siz osonlikcha:

  • O'tgan hafta, oy, chorak yoki yilni R bilan oling.
  • Sana, masalan, oxirgi 4 haftaga nisbatan belgilangan vaqt oralig'ini oling.
  • Olingan vaqt oralig'idan uning tarkibiy qismlarini ajratib olish oson: boshlanish va tugash sanasi, intervalga kiritilgan kunlar soni, unga kiritilgan sanalarning butun ketma-ketligi.

Barcha paket funksiyalarining nomi timeperiodsR intuitiv va ikki qismdan iborat: trend_oraliqqaerda:

  • trend unda siz berilgan sanaga nisbatan harakat qilishingiz kerak: oxirgi_n, oldingi, bu, keyingi, keyingi_n.
  • vaqtinchalik oraliq davrni hisoblash uchun: kun, hafta, oy, chorak, yil.

To'liq xususiyatlar to'plami:

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

Vaqt davrlaridagi vaqt intervallariR

Ushbu funktsiyalar o'tgan hafta yoki oy ma'lumotlari asosida hisobotlarni tuzish kerak bo'lgan hollarda foydalidir. Oxirgi oyni olish uchun xuddi shu nomdagi funksiyadan foydalaning previous_month():

prmonth <- previous_month()

Shundan so'ng sizda ob'ekt bo'ladi ertaga daraja tpr, undan quyidagi komponentlarni osongina olish mumkin:

  • davrning boshlanish sanasi, bizning misolimizda bu oxirgi oy
  • davr tugash sanasi
  • davrga kiritilgan kunlar soni
  • davrga kiritilgan sanalar ketma-ketligi

Bundan tashqari, har bir komponentni turli yo'llar bilan olishingiz mumkin:

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

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

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

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

Argument yordamida har qanday komponentni ham olishingiz mumkin qism, bu paket funksiyalarining har birida mavjud. Mumkin qiymatlar: boshlanish, tugatish, ketma-ketlik, uzunlik.

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

Shunday qilib, keling, paket funktsiyalarida mavjud bo'lgan barcha argumentlarni ko'rib chiqaylik timeperiodsR:

  • x — Vaqt davri hisoblab chiqiladigan mos yozuvlar sanasi, sukut bo'yicha joriy sana;
  • n — Davrga kiritiladigan intervallar soni, masalan, oldingi 3 hafta;
  • part — Ob'ektning qaysi komponenti tpr sukut bo'yicha olishingiz kerak all;
  • week_start — Argument faqat haftalar bilan ishlash funksiyalarida mavjud boʻlib, haftaning boshlanishi sanaladigan kunning sonini belgilashga imkon beradi.Sukut boʻyicha haftaning boshi dushanba, lekin siz istalgan kundan boshlab belgilashingiz mumkin. 1 - dushanbadan 7 - yakshanbagacha.

Shunday qilib, siz joriy yoki boshqa berilgan sanaga nisbatan istalgan vaqt davrini hisoblashingiz mumkin; bu erda yana bir nechta misollar:

# получить 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 oktyabr yakshanba:
R-da sanalar bilan ishlash (asosiy imkoniyatlar, shuningdek, moylash va vaqt oralig'iR paketlari)

Bizga 6-oktabrga nisbatan oldingi 3 hafta davom etadigan muddat kerak. 6 oktyabrni o'z ichiga olgan haftani hisobga olmaganda. Shunga ko'ra, bu 9 sentyabrdan 29 sentyabrgacha bo'lgan davr.

R-da sanalar bilan ishlash (asosiy imkoniyatlar, shuningdek, moylash va vaqt oralig'iR paketlari)

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

Ushbu misolda bizni 4 oy oldin bo'lgan oy qiziqtiradi, agar biz 16 yil 2019 sentyabrdan boshlasak, u 2019 yil may oyi edi.

timeperiodsR yordamida sanalar vektorini filtrlash

Sanalarni filtrlash uchun timeperiodsR Bir nechta operatorlar mavjud:

  • %left_out% - ikkita tpr klassi ob'ektini solishtiradi va chapdan o'ngda etishmayotgan qiymatni qaytaradi.
  • %left_in% - tpr sinfining ikkita ob'ektini solishtiradi va chap ob'ektdan o'ngga kiritilgan sanalarni qaytaradi.
  • %right_out% - ikkita tpr klassi ob'ektini solishtiradi va o'ngdan chapda etishmayotgan qiymatni qaytaradi.
  • %right_in% - tpr sinfining ikkita ob'ektini solishtiradi va chap ob'ektda mavjud bo'lgan o'ngdagi sanalarni qaytaradi.

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

Paketda timeperiodsR rasmiy, rus tilidagi mavjud YouTube pleylist.

xulosa

Biz sanalar bilan ishlash uchun R tilida yaratilgan ob'ektlar sinflarini batafsil ko'rib chiqdik. Shuningdek, endi siz sanalar bo'yicha arifmetik amallarni bajarishingiz va paket yordamida istalgan vaqt oralig'ini tezda olishingiz mumkin timeperiodsR.

Agar siz R tiliga qiziqsangiz, sizni telegram kanalimga obuna bo'lishni taklif qilaman R4 marketing, unda men kundalik muammolaringizni hal qilishda R tilidan foydalanish haqida har kuni foydali materiallarni baham ko'raman.

Manba: www.habr.com

a Izoh qo'shish