Кор бо санаҳо дар R (имкониятҳои асосӣ, инчунин бастаҳои lubridate ва timeperiodsR)

Санаи ҷорӣро бо ҳама забони барномасозӣ, амалиёти муодили "Салом ҷаҳон!" Забони R истисно нест.

Дар ин мақола мо дида мебароем, ки кор бо санаҳо дар синтаксиси асосии забони R чӣ гуна кор мекунад ва инчунин якчанд бастаҳои муфидро дида мебароем, ки имкониятҳои онро ҳангоми кор бо санаҳо васеъ мекунанд:

  • lubridate — маҷмӯае, ки ба шумо имкон медиҳад ҳисобҳои арифметикӣ байни санаҳо;
  • timeperiodsR — маҷмӯа барои кор бо фосилаҳои вақт ва ҷузъҳои онҳо.

Кор бо санаҳо дар R (имкониятҳои асосӣ, инчунин бастаҳои lubridate ва timeperiodsR)

Мундариҷа

Агар шумо ба таҳлили маълумот ва махсусан забони R таваҷҷӯҳ дошта бошед, шумо метавонед ба ман таваҷҷӯҳ кунед телеграмма и YouTube каналхо. Аксари мундариҷа ба забони R бахшида шудаанд.

  1. Кор бо санаҳо дар синтаксиси асосии R
    1.1. Матнро ба сана табдил диҳед
    1.2. Истихроҷи ҷузъҳои сана дар R
  2. Кор бо санаҳо бо истифода аз бастаи lubridate
    2.1. Бо истифода аз lubridate матнро ба имрӯз табдил диҳед
    2.2. Истихроҷи ҷузъҳои санаи бо истифода аз бастаи lubridate
    2.3. Амалҳои арифметикӣ бо санаҳо
  3. Кори соддакардашуда бо давраҳо, бастаи timeperiodsR
    3.1. Фосилаҳои вақт дар давраҳои вақт R
    3.2. Филтр кардани вектори санаҳо бо истифода аз timeperiodsR
  4. хулоса

Кор бо санаҳо дар синтаксиси асосии R

Матнро ба сана табдил диҳед

Basic R дорои маҷмӯи функсияҳо барои кор бо санаҳо мебошад. Камбудии синтаксиси асосӣ дар он аст, ки парвандаи номҳои функсия ва аргументҳо хеле пароканда буда, амалан робитаи мантиқӣ надорад. Бо вуҷуди ин, шумо бояд вазифаҳои асосии забонро донед, бинобар ин мо аз онҳо оғоз мекунем.

Аксар вақт ҳангоми боркунии маълумот ба R, аз файлҳои csv ё дигар манбаъҳо, шумо санаро ҳамчун матн мегиред. Барои табдил додани ин матн ба намуди дурусти додаҳо, функсияро истифода баред 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"

бо пешфарз as.Date() санаро дар ду формат қабул мекунад: САА-АА-ДД ё САА/ММ/ДД.
Агар маҷмӯи додаҳои шумо дорои санаҳо дар ягон формати дигар бошад, шумо метавонед далелро истифода баред format.

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

формат операторҳоро дар шакли сатр қабул мекунад, ки ҳар як фосилаи вақт ва формати онро ифода мекунад; арзишҳои маъмултарин дар ҷадвали зер нишон дода шудаанд:

Формат
Шарҳи

%d
Рақами рӯз дар моҳ

%a
Ихтисораи номи рӯзи ҳафта

%A
Номи пурраи рӯзи ҳафта

%w
Шумораи рӯзи ҳафта (0-6, ки 0 якшанбе аст)

%m
Номи ду рақами моҳ (01-12)

%b
Ихтисораи номи моҳ (апр, март, …)

%B
Номи пурраи моҳ

%y
Нишондиҳандаи ду рақами сол

%Y
Нишондиҳандаи соли чоррақама

%j
Рақами рӯз дар сол (001 - 366)

%U
Шумораи ҳафта дар сол (00 - 53), аввали ҳафта Якшанбе

%W
Рақами ҳафта дар сол (00 - 53), аввали ҳафта Душанбе

Мувофиқи он, "26 сентябри соли 2019" номи пурраи моҳ, сана ва сол мебошад. Ин формати санаро бо истифода аз операторҳо ба таври зерин тавсиф кардан мумкин аст:"%B %d, %Y".

Дар куҷо:

  • %B — Номи пурраи моҳ
  • %d - Шумораи рӯз дар моҳ
  • %Y — Нишондихандаи соли чорй

Ҳангоми тавсифи формати сана, муҳим аст, ки ҳамаи аломатҳои иловагиро аз сатри худ дохил кунед, ба монанди тире, вергул, нуқтаҳо, фосилаҳо ва ғайра. Дар мисоли ман, "26 сентябри соли 2019", пас аз сана вергул мавҷуд аст ва шумо инчунин бояд дар тавсифи формат вергул гузоред:"%B %d, %Y".

Ҳолатҳое ҳастанд, ки шумо санаеро мегиред, ки на танҳо ба форматҳои стандартӣ мувофиқат намекунад (САА-АА-ДД ё САА/АА/ДД), балки инчунин бо забоне, ки аз забони пешфарз, ки дар системаи оператсионии шумо насб шудааст, фарқ мекунад. Масалан, шумо маълумотеро зеркашӣ кардед, ки санаи он чунин нишон дода шудааст: "15 декабри соли 2019." Пеш аз табдил додани ин сатр ба сана, шумо бояд маҳаллиро тағир диҳед.

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

Истихроҷи ҷузъҳои сана дар R

Дар R асосӣ функсияҳои зиёд вуҷуд надоранд, ки ба шумо имкон медиҳанд, ки ягон қисми санаро аз объекти синфӣ ҷудо кунед таърих.

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

Илова ба синфи объекти асосӣ таърих дар R асосӣ боз 2 намуди маълумот мавҷуд аст, ки тамғаи вақтро нигоҳ медоранд: POSIXlt, POSIXct. Фарқи асосии байни ин синфҳо ва таърих он аст, ки илова ба санае, ки онҳо вақтро захира мекунанд.

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

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

# "POSIXct" "POSIXt"

функсия Sys.time() сана ва вақти ҷорӣро дар формат бармегардонад POSIXct. Ин формат аз ҷиҳати маъно ба он монанд аст UNIXTIME, ва миқдори сонияҳоро аз оғози давраи UNIX нигоҳ медорад (нисфи шаб (UTC) аз 31 декабри соли 1969 то 1 январи соли 1970).

Синф POSIXlt он инчунин вақт ва сана ва тамоми ҷузъҳои онҳоро нигоҳ медорад. Аз ин рӯ, он объекти дорои сохтори мураккабтар аст, вале аз он ба осонӣ ба даст овардани ҳама гуна ҷузъи сана ва вақт аст, зеро дар асл POSIXlt ин рӯйхат.

# Получаем текущую дату и время
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* аз рӯи вазифаҳо амалӣ карда мешавад as.POSIXct() и as.POSIXlt(). Ин функсияҳо маҷмӯи хурди аргументҳо доранд.

  • x — Объекти адад, сатр ё синф таърих, ки бояд табдил дода шавад;
  • tz — Минтақаи вақт, пешфарз "GMT";
  • формат — Тавсифи формати санае, ки дар он маълумот ба аргументи x дода мешавад;
  • сарчашма — Танҳо ҳангоми табдил додани адад ба POSIX истифода мешавад; шумо бояд объекти сана ва вақтеро, ки сонияҳо ба ин аргумент ҳисоб карда мешаванд, гузаронед. Одатан барои тарҷума аз UNIXTIME истифода мешавад.

Агар маълумоти сана ва вақти шумо дар UNIXTIME, пас барои табдил додани онҳо ба санаи равшан ва хондашаванда, мисоли зеринро истифода баред:

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

Дар ибтидо шумо метавонед ягон тамғаи вақтро муайян кунед. Масалан, агар маълумоти шумо сана ва вақтро ҳамчун шумораи сонияҳо аз 15 сентябри соли 2019 соати 12:15 дошта бошад, пас барои табдил додани он ба сана истифода баред:

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

Кор бо санаҳо бо истифода аз бастаи lubridate

lubridate Шояд бастаи маъмултарин барои кор бо санаҳо бо забони R. Он ба шумо се синфи иловагӣ медиҳад.

  • давомнокӣ — давомнокӣ, яъне. шумораи сонияҳо байни ду тамғаи вақт;
  • давраҳо - давраҳо ба шумо имкон медиҳанд, ки байни санаҳо дар фосилаҳои барои инсон хондашаванда ҳисоб кунед: рӯзҳо, моҳҳо, ҳафтаҳо ва ғайра;
  • фосилаҳо - объектҳое, ки нуқтаи оғоз ва анҷоми вақтро таъмин мекунанд.

Насби бастаҳои иловагӣ ба забони R бо истифода аз функсияи стандартӣ амалӣ карда мешавад install.packages().

Насб кардани баста lubridate:

install.packages("lubridate")

Бо истифода аз lubridate матнро ба имрӯз табдил диҳед

Хусусиятҳои баста lubridate раванди табдил додани матнро ба сана ба таври назаррас осон мекунад ва инчунин ба шумо имкон медиҳад, ки ҳама гуна амалиёти арифметикиро бо сана ва вақт анҷом диҳед.

Функсияҳо ба шумо кӯмак мекунанд, ки санаи ҷорӣ ё сана ва вақтро гиред today() и now().

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

Барои табдил додани сатр ба сана дар lubridate Як оилаи пурраи функсияҳо мавҷуд аст, ки номашон ҳамеша аз се ҳарф иборат аст ва пайдарпаии ҷузъҳои санаро нишон медиҳад:

  • y - сол
  • м - моҳ
  • г - рӯз

Рӯйхати функсияҳо барои табдил додани матн ба санаи тавассути lubridate

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

Баъзе мисолҳо барои табдил додани сатрҳо ба санаҳо:

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

Тавре, ки шумо мебинед lubridate Он дар шинохти тавсифи сана ҳамчун матн хеле самараноктар аст ва ба шумо имкон медиҳад, ки матнро бе истифодаи операторҳои иловагӣ барои тавсифи формат табдил диҳед.

Истихроҷи ҷузъҳои санаи бо истифода аз бастаи lubridate

Инчунин истифода lubridate шумо метавонед ҳама гуна компонентҳоро аз санаи зерин дастрас кунед:

dt <- ymd("2017 jan 21")

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

Амалҳои арифметикӣ бо санаҳо

Аммо вазифаи муҳимтарин ва асосӣ lubridate қобилияти иҷро кардани амалҳои гуногуни арифметикӣ бо санаҳо мебошад.

Яклухткунии сана бо се функсия иҷро карда мешавад:

  • floor_date — яклухт кардан ба замони гузаштаи наздиктарин
  • ceiling_date — яклухт кардан ба замони ояндаи наздик
  • round_date - яклухткунӣ ба вақти наздиктарин

Ҳар яке аз ин функсияҳо далел доранд воҳимаки ба шумо имкон медиҳад воҳиди яклухтро муайян кунед: сония, дақиқа, соат, рӯз, ҳафта, моҳ, думоҳа, семоҳа, мавсим, нимсола, сол

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

Пас биёед бифаҳмем, ки чӣ тавр санаи 8 рӯз пас аз санаи ҷорӣ ба даст оварда мешавад ва дар байни ин ду сана дигар ҳисобҳои арифметикӣ анҷом медиҳем.

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

Кори соддакардашуда бо давраҳо, бастаи timeperiodsR.

timeperiodsR - бастаи нав барои кор бо санаҳо, ки дар CRAN дар моҳи сентябри соли 2019 нашр шудааст.

Насб кардани баста timeperiodsR:

install.packages("timeperiodsR")

Мақсади асосӣ ин аст, ки зуд муайян кардани фосилаи вақти муайян нисбат ба санаи додашуда. Масалан, бо истифода аз функсияҳои он шумо метавонед ба осонӣ:

  • Ҳафта, моҳ, семоҳа ё соли гузаштаро дар R гиред.
  • Миқдори муайяни фосилаҳои вақтро нисбат ба сана, масалан, 4 ҳафтаи охир гиред.
  • Ҷузъҳои онро аз фосилаи вақти натиҷавӣ баровардан осон аст: санаи оғоз ва анҷом, шумораи рӯзҳое, ки ба фосила дохил карда шудаанд, тамоми пайдарпаии санаҳои ба он дохилшуда.

Номи ҳамаи вазифаҳои баста timeperiodsR интуитивӣ буда, аз ду қисм иборат аст: роҳнамо_фосила, ки:

  • роҳнамо ки дар он шумо бояд нисбат ба санаи додашуда ҳаракат кунед: last_n, гузашта, ин, оянда, оянда_n.
  • муваққатӣ фосила барои ҳисоб кардани давра: рӯз, ҳафта, моҳ, квартал, сол.

Маҷмӯи хусусиятҳои пурра:

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

Фосилаҳои вақт дар давраҳои вақт R

Ин функсияҳо дар ҳолатҳое муфиданд, ки шумо бояд гузоришҳоро дар асоси маълумоти ҳафта ё моҳи гузашта созед. Барои гирифтани моҳи охир, функсияи ҳамон номро истифода баред previous_month():

prmonth <- previous_month()

Пас аз он шумо объект хоҳед дошт пеш дараҷа тпр, ки аз он ҷузъҳои зеринро ба осонӣ ба даст овардан мумкин аст:

  • санаи оғози давра, дар мисоли мо ин моҳи охир аст
  • санаи анҷоми давра
  • шумораи рӯзҳое, ки ба давра дохил карда шудаанд
  • пайдарпайии санаҳои ба давра дохилшуда

Ғайр аз он, шумо метавонед ҳар як ҷузъро бо роҳҳои гуногун ба даст оред:

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

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

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

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

Шумо инчунин метавонед бо истифода аз аргумент ягон ҷузъро гиред қисми, ки дар ҳар як функсияи баста мавҷуд аст. Қиматҳои имконпазир: оғоз, анҷом, пайдарпаӣ, дарозӣ.

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

Пас, биёед ҳамаи далелҳои дар функсияҳои баста мавҷудбударо бубинем timeperiodsR:

  • x - Санаи истинод, ки аз он давраи вақт ҳисоб карда мешавад, санаи ҷорӣ бо нобаёнӣ;
  • n - Шумораи фосилаҳое, ки ба давра дохил карда мешаванд, масалан, 3 ҳафтаи қаблӣ;
  • part — Кадом таркибии объект tpr шумо бояд ба даст, ба таври нобаёнӣ all;
  • week_start — Аргумент танҳо дар функсияҳои кор бо ҳафтаҳо мавҷуд аст ва ба шумо имкон медиҳад, ки рақами рӯзи ҳафтаро, ки ибтидои он ҳисобида мешавад, муқаррар кунед.Ба таври муқаррарӣ, оғози ҳафта душанбе аст, аммо шумо метавонед дилхоҳ аз 1 - Душанбе то 7 - Якшанбе.

Ҳамин тариқ, шумо метавонед ҳар давраи вақтро нисбат ба санаи ҷорӣ ё санаи дигари додашударо ҳисоб кунед; инҳоянд чанд мисоли дигар:

# получить 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 октябр якшанбе аст:
Кор бо санаҳо дар R (имкониятҳои асосӣ, инчунин бастаҳои lubridate ва timeperiodsR)

Ба мо даврае лозим аст, ки нисбат ба 6 октябр, 3 ҳафтаи қаблиро дарбар мегирад. На аз он ҷумла ҳафтае, ки худи 6 октябрро дар бар мегирад. Мутаносибан ин давра аз 9 то 29 сентябрь аст.

Кор бо санаҳо дар R (имкониятҳои асосӣ, инчунин бастаҳои lubridate ва 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

Дар ин мисол, мо ба моҳе таваҷҷӯҳ дорем, ки 4 моҳ пеш буд, агар мо аз 16 сентябри соли 2019 сар кунем, пас он моҳи майи соли 2019 буд.

Филтр кардани вектори санаҳо бо истифода аз timeperiodsR

Барои филтр кардани санаҳо дар timeperiodsR Якчанд операторҳо мавҷуданд:

  • %left_out% - ду объекти синфи tpr-ро муқоиса мекунад ва арзиши аз тарафи чапи дар рост мавҷудбударо бармегардонад.
  • %left_in% - ду объекти синфи tpr-ро муқоиса мекунад ва санаҳои объекти чапро, ки ба объекти рост дохил карда шудаанд, бармегардонад.
  • %right_out% - ду объекти синфи tpr-ро муқоиса мекунад ва арзишро аз объекти рост, ки аз тарафи чап мавҷуд нест, бармегардонад.
  • %right_in% - ду объекти синфи tpr-ро муқоиса мекунад ва санаи объекти ростро, ки дар объекти чап мавҷуд аст, бармегардонад.

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

Дар баста timeperiodsR расмй, русзабон мавчуд аст Рӯйхати навозиш YouTube.

хулоса

Мо синфҳои объектҳоеро, ки бо забони R барои кор бо санаҳо тарҳрезӣ шудаанд, муфассал баррасӣ кардем. Инчунин акнун шумо метавонед бо истифода аз бастаҳо амалҳои арифметикиро дар санаҳо иҷро кунед ва ҳар гуна давраҳои вақтро зуд ба даст оред timeperiodsR.

Агар шумо ба забони R таваҷҷӯҳ дошта бошед, ман шуморо даъват мекунам, ки ба канали телеграми ман обуна шавед R4маркетинг, ки дар он ман ҳамарӯза маводи муфидро дар бораи истифодаи забони R дар ҳалли мушкилоти ҳаррӯзаи шумо мубодила мекунам.

Манбаъ: will.com

Илова Эзоҳ