R-д огноотой ажиллах (үндсэн боломжууд, түүнчлэн тосолгооны материал, цаг хугацааны R багцууд)

Одоогийн огноог ямар ч програмчлалын хэлээр авах, "Сайн уу ертөнц!" R хэл нь үл хамаарах зүйл биш юм.

Энэ нийтлэлд бид огноотой ажиллах нь R хэлний үндсэн синтакс дээр хэрхэн ажилладаг талаар, мөн огноотой ажиллахдаа түүний чадавхийг өргөжүүлдэг хэд хэдэн ашигтай багцуудыг авч үзэх болно.

  • lubridate — огнооны хооронд арифметик тооцоолол хийх боломжийг олгодог багц;
  • timeperiodsR - цаг хугацааны интервал ба тэдгээрийн бүрэлдэхүүн хэсгүүдтэй ажиллах багц.

R-д огноотой ажиллах (үндсэн боломжууд, түүнчлэн тосолгооны материал, цаг хугацааны R багцууд)

Агуулга

Хэрэв та өгөгдлийн шинжилгээ, ялангуяа R хэлийг сонирхож байгаа бол миний хэлийг сонирхож магадгүй юм цахилгаан мэдээ и YouTube-ийн сувгууд. Ихэнх контент нь R хэлэнд зориулагдсан.

  1. Үндсэн R синтакс дээр огноотой ажиллах
    1.1. Текстийг огноо руу хөрвүүлэх
    1.2. Үндсэн R хэл дээрх огнооны бүрэлдэхүүн хэсгүүдийг задлах
  2. Тосолгооны багцыг ашиглан огноотой ажиллах
    2.1. lubridate ашиглан текстийг өнөөг хүртэл хөрвүүлэх
    2.2. Тосолгооны багцыг ашиглан огнооны бүрэлдэхүүн хэсгүүдийг гаргаж авах
    2.3. Огноо бүхий арифметик үйлдлүүд
  3. Цэгүүдтэй хялбаршуулсан ажил, timeperiodsR багц
    3.1. Цаг хугацааны интервалуудR
    3.2. timeperiodsR ашиглан огнооны векторыг шүүх
  4. дүгнэлт

Үндсэн R синтакс дээр огноотой ажиллах

Текстийг огноо руу хөрвүүлэх

Basic R нь огноотой ажиллах олон функцтэй. Үндсэн синтаксийн сул тал нь функцын нэрс болон аргументуудын тохиолдол маш тархай бутархай бөгөөд бараг логик холболтгүй байдаг. Гэсэн хэдий ч та хэлний үндсэн функцуудыг мэдэх хэрэгтэй, тиймээс бид тэднээс эхлэх болно.

Ихэнх тохиолдолд csv файлууд эсвэл бусад эх сурвалжаас өгөгдлийг R руу ачаалах үед та огноог текст хэлбэрээр хүлээн авдаг. Энэ текстийг зөв өгөгдлийн төрөл болгон хөрвүүлэхийн тулд функцийг ашиглана уу 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() Огноог хоёр форматаар хүлээн зөвшөөрдөг: ӨӨӨӨ-АА-ӨГ буюу YYYY/MM/DD.
Хэрэв таны өгөгдлийн багц өөр форматтай огноог агуулж байвал та аргументыг ашиглаж болно format.

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

хэлбэр ямар ч цагийн интервал болон түүний форматыг илэрхийлсэн мөр хэлбэрээр операторуудыг хүлээн авдаг; хамгийн түгээмэл хэрэглэгддэг утгуудыг доорх хүснэгтэд үзүүлэв.

Формат
Тайлбар

%d
Сар дахь өдрийн тоо

%a
Долоо хоногийн өдрийн нэрний товчлол

%A
Долоо хоногийн өдрийн бүтэн нэр

%w
Долоо хоногийн өдрийн тоо (0-6, 0 нь Ням гараг)

%m
Хоёр оронтой сарын тэмдэглэгээ (01-12)

%b
Сарын нэрний товчлол (XNUMX, XNUMX, …)

%B
Бүтэн сарын нэр

%y
Хоёр оронтой жилийн тэмдэглэгээ

%Y
Дөрвөн оронтой жилийн тэмдэглэгээ

%j
Жилийн өдрийн дугаар (001 - 366)

%U
Жилийн долоо хоногийн тоо (00 - 53), долоо хоногийн эхлэл Ням гараг

%W
Жилийн долоо хоногийн дугаар (00 - 53), долоо хоногийн Даваа гараг

Үүний дагуу “26 оны есдүгээр сарын 2019” гэдэг нь сар, огноо, жилийн бүтэн нэр юм. Энэ огнооны форматыг оператор ашиглан дараах байдлаар тодорхойлж болно."%B %d, %Y".

Хаана:

  • %B - Сарын бүтэн нэр
  • %d - Сар дахь өдрийн тоо
  • %Y - Дөрвөн оронтой жилийн тэмдэглэгээ

Огнооны форматыг тайлбарлахдаа зураас, таслал, цэг, зай гэх мэт бүх нэмэлт тэмдэгтүүдийг оруулах нь чухал юм. Миний жишээн дээр "26 оны 2019-р сарын XNUMX" гэсэн огнооны дараа таслал байгаа бөгөөд та форматын тайлбарт таслал тавих хэрэгтэй:"%B %d, %Y".

Зөвхөн стандарт форматтай тохирохгүй огноог хүлээн авах тохиолдол байдаг (ЖЭЭЖ-АА-ӨГ эсвэл ЖЖЖ/АА/ӨГ), гэхдээ бас таны үйлдлийн системд суулгасан өгөгдмөл хэлнээс ялгаатай хэлээр. Жишээлбэл, та "15 оны 2019-р сарын XNUMX" гэсэн огноог харуулсан өгөгдлийг татаж авсан. Энэ мөрийг огноо болгон хөрвүүлэхийн өмнө та хэлийг өөрчлөх хэрэгтэй.

# Меняем локаль
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 эриний эхэн үеэс хойшхи секундын тоог хадгалдаг (31 оны 1969-р сарын 1-ээс 1970 оны XNUMX-р сарын XNUMX хүртэл шөнө дунд (UTC)).

Класс 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:XNUMX цагаас хойшхи секундын тоогоор огноо, цагийг агуулж байвал түүнийг огноо болгон хөрвүүлэхийн тулд:

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

Тосолгооны багцыг ашиглан огноотой ажиллах

lubridate Магадгүй R хэл дээрх огноотой ажиллах хамгийн алдартай багц. Энэ нь танд нэмэлт гурван анги өгдөг.

  • үргэлжлэх хугацаа - үргэлжлэх хугацаа, өөрөөр хэлбэл. хоёр цагийн тэмдгийн хоорондох секундын тоо;
  • хугацаа - хугацаа нь хүний ​​унших боломжтой интервалаар огнооны хооронд тооцоолол хийх боломжийг олгодог: өдөр, сар, долоо хоног гэх мэт;
  • интервалууд - цаг хугацааны эхлэл ба төгсгөлийн цэгийг өгдөг объектууд.

R хэл дээрх нэмэлт багцуудыг суулгах нь стандарт функцийг ашиглан хийгддэг install.packages().

Багцыг суулгаж байна lubridate:

install.packages("lubridate")

lubridate ашиглан текстийг өнөөг хүртэл хөрвүүлэх

Багцын онцлог lubridate Текстийг огноо болгон хөрвүүлэх үйл явцыг ихээхэн хялбаршуулж, огноо, цаг бүхий аливаа арифметик үйлдлийг хийх боломжийг танд олгоно.

Функцууд нь танд одоогийн огноо, огноо, цагийг авахад тусална today() и now().

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

Мөрийг огноо болгон хөрвүүлэхийн тулд lubridate Нэр нь үргэлж гурван үсгээс бүрдэх функцүүдийн бүхэл бүтэн гэр бүл байдаг бөгөөд огнооны бүрэлдэхүүн хэсгүүдийн дарааллыг заана.

  • y - жил
  • м - сар
  • d - өдөр

Текстийг lubridate ашиглан өнөөг хүртэл хөрвүүлэх функцүүдийн жагсаалт

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

Мөрүүдийг огноо руу хөрвүүлэх зарим жишээ:

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

Өөрөө харж байгаа байх 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 - 2019 оны XNUMX-р сард CRAN дээр нийтлэгдсэн огноотой ажиллах шинэ багц.

Багцыг суулгаж байна timeperiodsR:

install.packages("timeperiodsR")

Гол зорилго нь өгөгдсөн огноотой харьцуулахад тодорхой хугацааны интервалыг хурдан тодорхойлох явдал юм. Жишээлбэл, түүний функцийг ашиглан та дараахь зүйлийг хялбархан хийж чадна.

  • Өнгөрсөн долоо хоног, сар, улирал эсвэл жилийг R хэлээр авна уу.
  • Сүүлийн 4 долоо хоног гэх мэт огноотой холбоотой тодорхой тооны хугацааны интервалыг авна уу.
  • Үүссэн хугацааны интервалаас түүний бүрэлдэхүүн хэсгүүдийг гаргаж авахад хялбар байдаг: эхлэх ба дуусах огноо, интервалд багтсан өдрийн тоо, түүнд багтсан бүх огнооны дараалал.

Бүх багц функцүүдийн нэр timeperiodsR мэдрэмжтэй бөгөөд хоёр хэсгээс бүрдэнэ: чиглэл_интервал, хаана:

  • чиглэл Та өгөгдсөн огноотой харьцуулахад шилжих шаардлагатай: сүүлийн_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()

Үүний дараа та объекттой болно premonth анги тпрДараах бүрэлдэхүүн хэсгүүдийг хялбархан олж авах боломжтой.

  • хугацааны эхлэх огноо, бидний жишээнд энэ бол сүүлийн сар юм
  • хугацаа дуусах огноо
  • хугацаанд багтсан өдрийн тоо
  • хугацаанд орсон огнооны дараалал

Нэмж дурдахад та бүрэлдэхүүн хэсэг бүрийг янз бүрийн аргаар олж авах боломжтой.

# первый день периода
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-д огноотой ажиллах (үндсэн боломжууд, түүнчлэн тосолгооны материал, цаг хугацааны R багцууд)

Бид 6-р сарын 3-тай харьцуулахад өмнөх 6 долоо хоног шаардагдах хугацаа хэрэгтэй байна. Аравдугаар сарын 9-ны долоо хоногийг оруулаагүй болно. Үүний дагуу энэ нь есдүгээр сарын 29-нөөс есдүгээр сарын XNUMX хүртэлх хугацаа юм.

R-д огноотой ажиллах (үндсэн боломжууд, түүнчлэн тосолгооны материал, цаг хугацааны R багцууд)

# получить месяц отстающий на 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-наас эхэлсэн бол XNUMX оны XNUMX-р сар байсан.

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 хэлийг таны өдөр тутмын асуудлыг шийдвэрлэхэд ашиглах талаар өдөр бүр хэрэгтэй материалуудыг хуваалцдаг.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх