Paggawa gamit ang mga petsa sa R ​​(mga pangunahing kakayahan, pati na rin ang lubridate at timeperiodsR na mga pakete)

Kunin ang kasalukuyang petsa sa anumang programming language, isang operasyon na katumbas ng "Hello world!" Ang wikang R ay walang pagbubukod.

Sa artikulong ito, titingnan natin kung paano gumagana ang mga petsa sa pangunahing syntax ng wikang R, at titingnan din ang ilang kapaki-pakinabang na mga pakete na nagpapalawak ng mga kakayahan nito kapag nagtatrabaho sa mga petsa:

  • lubridate — isang pakete na nagpapahintulot sa iyo na magsagawa ng mga kalkulasyon ng aritmetika sa pagitan ng mga petsa;
  • timeperiodsR — isang pakete para sa pagtatrabaho sa mga agwat ng oras at mga bahagi nito.

Paggawa gamit ang mga petsa sa R ​​(mga pangunahing kakayahan, pati na rin ang lubridate at timeperiodsR na mga pakete)

nilalaman

Kung interesado ka sa pagsusuri ng data, at sa partikular na wikang R, maaaring interesado ka sa aking telegram и youtube mga channel. Karamihan sa nilalaman ay nakatuon sa wikang R.

  1. Paggawa gamit ang mga petsa sa basic R syntax
    1.1. I-convert ang teksto sa petsa
    1.2. Pagkuha ng mga bahagi ng petsa sa pangunahing R
  2. Paggawa gamit ang mga petsa gamit ang lubridate package
    2.1. I-convert ang text to date gamit ang lubridate
    2.2. Pag-extract ng mga bahagi ng petsa gamit ang lubridate package
    2.3. Mga operasyon sa aritmetika na may mga petsa
  3. Pinasimpleng trabaho na may mga tuldok, timeperiodsR package
    3.1. Mga agwat ng oras sa mga yugto ng panahonR
    3.2. Pag-filter ng vector ng mga petsa gamit ang timeperiodsR
  4. Konklusyon

Paggawa gamit ang mga petsa sa basic R syntax

I-convert ang teksto sa petsa

Ang Basic R ay may isang hanay ng mga function para sa pagtatrabaho sa mga petsa. Ang kawalan ng pangunahing syntax ay ang kaso ng mga pangalan ng function at argumento ay napakalat at halos walang lohikal na koneksyon. Gayunpaman, kailangan mong malaman ang mga pangunahing pag-andar ng wika, kaya magsisimula kami sa kanila.

Kadalasan kapag naglo-load ng data sa R, mula sa mga csv file, o iba pang mapagkukunan, nakakatanggap ka ng petsa bilang text. Upang i-convert ang text na ito sa tamang uri ng data, gamitin ang function 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() tumatanggap ng petsa sa dalawang format: YYYY-MM-DD o YYYY/MM/DD.
Kung ang iyong set ng data ay naglalaman ng mga petsa sa ibang format, maaari mong gamitin ang argumento format.

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

format tumatanggap ng mga operator sa string form na nagsasaad ng anumang agwat ng oras at ang format nito; ang pinakakaraniwang ginagamit na mga halaga ay ipinapakita sa talahanayan sa ibaba:

Format
Описание

%d
Numero ng araw sa buwan

%a
Pagpapaikli para sa pangalan ng araw ng linggo

%A
Buong pangalan ng araw ng linggo

%w
Bilang ng araw ng linggo (0-6, kung saan ang 0 ay Linggo)

%m
Dalawang-digit na buwang pagtatalaga (01-12)

%b
Pagpapaikli ng pangalan ng buwan (apr, mar, ...)

%B
Pangalan ng buong buwan

%y
Dalawang-digit na taon na pagtatalaga

%Y
Apat na digit na taon na pagtatalaga

%j
Numero ng araw sa taon (001 - 366)

%U
Bilang ng linggo sa taon (00 - 53), simula ng linggo Linggo

%W
Numero ng linggo sa taon (00 - 53), simula ng linggo ng Lunes

Alinsunod dito, ang "Setyembre 26, 2019" ay ang buong pangalan ng buwan, petsa at taon. Ang format ng petsa na ito ay maaaring ilarawan gamit ang mga operator tulad ng sumusunod:"%B %d, %Y".

Saan:

  • %B — Buong pangalan ng buwan
  • %d — Bilang ng araw sa buwan
  • %Y — Apat na digit na taon na pagtatalaga

Kapag inilalarawan ang format ng petsa, mahalagang isama ang lahat ng karagdagang character mula sa iyong string, gaya ng mga gitling, kuwit, tuldok, espasyo, at iba pa. Sa aking halimbawa, "Setyembre 26, 2019", mayroong kuwit pagkatapos ng petsa, at kailangan mo ring maglagay ng kuwit sa paglalarawan ng format:"%B %d, %Y".

May mga sitwasyon kapag nakatanggap ka ng isang petsa na hindi lamang tumutugma sa mga karaniwang format (YYYY-MM-DD o YYYY/MM/DD), ngunit din sa isang wika na naiiba sa default na naka-install sa iyong operating system. Halimbawa, nag-download ka ng data kung saan nakasaad ang petsa nang ganito: “Disyembre 15, 2019.” Bago i-convert ang string na ito sa isang petsa, kailangan mong baguhin ang locale.

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

Pagkuha ng mga bahagi ng petsa sa pangunahing R

Walang maraming mga pag-andar sa pangunahing R na nagbibigay-daan sa iyo upang kunin ang anumang bahagi ng isang petsa mula sa isang object ng klase petsa.

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

Bilang karagdagan sa pangunahing klase ng bagay petsa sa basic R mayroong 2 pang uri ng data na nag-iimbak ng timestamp: POSIXlt, POSIXct. Ang pangunahing pagkakaiba sa pagitan ng mga klase na ito at petsa ay iyon bilang karagdagan sa petsa ng oras ng pag-iimbak nila.

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

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

# "POSIXct" "POSIXt"

Tungkulin Sys.time() ibinabalik ang kasalukuyang petsa at oras sa format POSIXct. Ang format na ito ay katulad ng kahulugan sa UNIXTIME, at iniimbak ang bilang ng mga segundo mula noong simula ng panahon ng UNIX (hatinggabi (UTC) mula Disyembre 31, 1969 hanggang Enero 1, 1970).

klase POSIXlt nag-iimbak din ito ng oras at petsa, at lahat ng mga bahagi nito. Samakatuwid, ito ay isang bagay na may mas kumplikadong istraktura, ngunit mula sa kung saan ito ay madaling makakuha ng anumang bahagi ng petsa at oras dahil sa totoo lang POSIXlt это listahan.

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

Pag-convert ng numeric at text data sa mga format POSIX* isinasagawa ng mga function as.POSIXct() и as.POSIXlt(). Ang mga function na ito ay may maliit na hanay ng mga argumento.

  • x — Numero, string o bagay ng klase petsa, na kailangang ma-convert;
  • tz — Time zone, default na "GMT";
  • format — Paglalarawan ng format ng petsa kung saan kinakatawan ang data na ipinasa sa x argument;
  • pinanggalingan — Ginagamit lamang kapag nagko-convert ng numero sa POSIX; dapat kang magpasa ng object ng petsa at oras kung saan binibilang ang mga segundo sa argumentong ito. Karaniwang ginagamit para sa pagsasalin mula sa UNIXTIME.

Kung ang iyong impormasyon sa petsa at oras ay nasa UNIXTIME, pagkatapos ay i-convert ang mga ito sa isang malinaw, nababasang petsa, gamitin ang sumusunod na halimbawa:

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

Sa pinanggalingan maaari mong tukuyin ang anumang timestamp. Halimbawa, kung naglalaman ang iyong data ng petsa at oras bilang bilang ng mga segundo mula noong Setyembre 15, 2019 12:15 pm, pagkatapos ay i-convert ito sa isang paggamit ng petsa:

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

Paggawa gamit ang mga petsa gamit ang lubridate package

lubridate Marahil ang pinakasikat na pakete para sa pagtatrabaho sa mga petsa sa wikang R. Nagbibigay ito sa iyo ng tatlong karagdagang klase.

  • mga tagal - tagal, i.e. bilang ng mga segundo sa pagitan ng dalawang timestamp;
  • mga panahon - pinapayagan ka ng mga tuldok na gumawa ng mga kalkulasyon sa pagitan ng mga petsa sa mga pagitan na nababasa ng tao: mga araw, buwan, linggo, at iba pa;
  • mga agwat - mga bagay na nagbibigay ng simula at pagtatapos ng oras.

Ang pag-install ng mga karagdagang pakete sa wikang R ay isinasagawa gamit ang karaniwang pag-andar install.packages().

Pag-install ng package lubridate:

install.packages("lubridate")

I-convert ang text to date gamit ang lubridate

Mga tampok ng package lubridate makabuluhang pinasimple ang proseso ng pag-convert ng teksto sa isang petsa, at nagbibigay-daan din sa iyo na magsagawa ng anumang mga operasyon sa aritmetika na may mga petsa at oras.

Tutulungan ka ng mga function na makuha ang kasalukuyang petsa o petsa at oras today() и now().

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

Upang i-convert ang isang string sa isang petsa sa lubridate Mayroong isang buong pamilya ng mga function na ang mga pangalan ay palaging binubuo ng tatlong titik, at nagpapahiwatig ng pagkakasunud-sunod ng mga bahagi ng petsa:

  • y - taon
  • m - buwan
  • d - araw

Listahan ng mga function para sa pag-convert ng teksto sa petsa sa pamamagitan ng lubridate

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

Ilang halimbawa para sa pag-convert ng mga string sa mga petsa:

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

Tulad ng nakikita mo lubridate Ito ay mas mahusay sa pagkilala sa mga paglalarawan ng petsa bilang teksto, at pinapayagan kang mag-convert ng teksto sa petsa nang hindi gumagamit ng mga karagdagang operator upang ilarawan ang format.

Pag-extract ng mga bahagi ng petsa gamit ang lubridate package

Gumagamit din lubridate maaari kang makakuha ng anumang bahagi mula sa isang petsa:

dt <- ymd("2017 jan 21")

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

Mga operasyon sa aritmetika na may mga petsa

Ngunit ang pinakamahalaga at pangunahing pag-andar lubridate ay ang kakayahang magsagawa ng iba't ibang mga operasyon sa aritmetika na may mga petsa.

Ang pag-ikot ng petsa ay isinasagawa ng tatlong function:

  • floor_date — pag-ikot sa pinakamalapit na past tense
  • ceiling_date — pag-ikot sa malapit na hinaharap na panahunan
  • round_date - pag-ikot sa pinakamalapit na oras

Ang bawat isa sa mga function na ito ay may argumento yunitna nagbibigay-daan sa iyong tukuyin ang rounding unit: pangalawa, minuto, oras, araw, linggo, buwan, dalawang buwan, quarter, season, kalahating taon, taon

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

Kaya't alamin natin kung paano makakuha ng petsa na 8 araw pagkatapos ng kasalukuyang petsa at gumawa ng iba't ibang mga kalkulasyon ng aritmetika sa pagitan ng dalawang petsa.

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

Pinasimpleng trabaho na may mga tuldok, timeperiodsR package.

timeperiodsR — isang sariwang pakete para sa pagtatrabaho sa mga petsa na na-publish sa CRAN noong Setyembre 2019.

Pag-install ng package timeperiodsR:

install.packages("timeperiodsR")

Ang pangunahing layunin ay upang mabilis na matukoy ang isang tiyak na agwat ng oras na nauugnay sa isang naibigay na petsa. Halimbawa, gamit ang mga function nito madali mong:

  • Kunin ang nakaraang linggo, buwan, quarter o taon sa R.
  • Kumuha ng tinukoy na bilang ng mga agwat ng oras na nauugnay sa isang petsa, halimbawa sa nakalipas na 4 na linggo.
  • Madaling kunin ang mga bahagi nito mula sa nagresultang agwat ng oras: ang petsa ng pagsisimula at pagtatapos, ang bilang ng mga araw na kasama sa pagitan, ang buong pagkakasunud-sunod ng mga petsa na kasama dito.

Pangalan ng lahat ng mga function ng package timeperiodsR ay intuitive at binubuo ng dalawang bahagi: direksyon_agwat, kung saan:

  • direksyon kung saan kailangan mong ilipat kaugnay sa isang ibinigay na petsa: last_n, nakaraan, ito, susunod, next_n.
  • pansamantala agwat upang kalkulahin ang panahon: araw, linggo, buwan, quarter, taon.

Buong Hanay ng Tampok:

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

Mga agwat ng oras sa mga yugto ng panahonR

Ang mga function na ito ay kapaki-pakinabang sa mga kaso kung saan kailangan mong bumuo ng mga ulat batay sa data mula sa nakaraang linggo o buwan. Upang makuha ang nakaraang buwan, gamitin ang function ng parehong pangalan previous_month():

prmonth <- previous_month()

Pagkatapos nito ay magkakaroon ka ng isang bagay prmonth klase tr, kung saan madaling makuha ang mga sumusunod na sangkap:

  • ang petsa ng pagsisimula ng panahon, sa aming halimbawa ito ang huling buwan
  • petsa ng pagtatapos ng panahon
  • bilang ng mga araw na kasama sa panahon
  • pagkakasunud-sunod ng mga petsa na kasama sa panahon

Bukod dito, maaari mong makuha ang bawat isa sa mga bahagi sa iba't ibang paraan:

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

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

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

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

Maaari mo ring makuha ang alinman sa mga bahagi gamit ang argumento bahagi, na naroroon sa bawat isa sa mga function ng package. Mga posibleng halaga: simula, wakas, pagkakasunud-sunod, haba.

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

Kaya tingnan natin ang lahat ng mga argumento na magagamit sa mga function ng package timeperiodsR:

  • x — Ang petsa ng sanggunian kung saan kakalkulahin ang yugto ng panahon, ang kasalukuyang petsa bilang default;
  • n — Ang bilang ng mga agwat na isasama sa panahon, halimbawa sa nakaraang 3 linggo;
  • part — Aling bahagi ng bagay tpr kailangan mong makuha, bilang default all;
  • week_start — Ang argumento ay naroroon lamang sa mga function para sa pagtatrabaho sa mga linggo, at nagbibigay-daan sa iyong itakda ang bilang ng araw ng linggo na ituturing na simula nito. Bilang default, ang simula ng linggo ay Lunes, ngunit maaari kang magtakda ng anuman mula sa 1 - Lunes hanggang 7 - Linggo.

Kaya, maaari mong kalkulahin ang anumang yugto ng panahon na nauugnay sa kasalukuyan o anumang iba pang ibinigay na petsa; narito ang ilang higit pang mga halimbawa:

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

Ang Oktubre 6 ay Linggo:
Paggawa gamit ang mga petsa sa R ​​(mga pangunahing kakayahan, pati na rin ang lubridate at timeperiodsR na mga pakete)

Kailangan namin ng panahon na, kaugnay ng Oktubre 6, ay aabot sa nakaraang 3 linggo. Hindi kasama ang linggo na kinabibilangan mismo ng Oktubre 6. Alinsunod dito, ito ang panahon mula Setyembre 9 hanggang Setyembre 29.

Paggawa gamit ang mga petsa sa R ​​(mga pangunahing kakayahan, pati na rin ang lubridate at timeperiodsR na mga pakete)

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

Sa halimbawang ito, interesado kami sa buwan na 4 na buwan na ang nakalipas, kung magsisimula kami sa Setyembre 16, 2019, pagkatapos noon ay Mayo 2019.

Pag-filter ng vector ng mga petsa gamit ang timeperiodsR

Upang i-filter ang mga petsa sa timeperiodsR Mayroong ilang mga operator:

  • %left_out% - naghahambing ng dalawang tpr class object, at ibinabalik ang halaga mula sa kaliwa na nawawala sa kanan.
  • %left_in% - pinagkukumpara ang dalawang object ng tpr class, at ibinabalik ang mga petsa mula sa kaliwang object na kasama sa kanan.
  • %right_out% - naghahambing ng dalawang tpr class object, at ibinabalik ang halaga mula sa kanan na nawawala mula sa kaliwa.
  • %right_in% - naghahambing ng dalawang object ng tpr class, at nagbabalik ng mga petsa mula sa tamang object na nasa kaliwa.

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

Sa pakete timeperiodsR mayroong isang opisyal, wikang Ruso Playlist sa YouTube.

Konklusyon

Sinuri namin nang detalyado ang mga klase ng mga bagay na idinisenyo sa wikang R para sa pagtatrabaho sa mga petsa. Gayundin ngayon maaari kang magsagawa ng mga pagpapatakbo ng aritmetika sa mga petsa, at mabilis na makakuha ng anumang yugto ng panahon gamit ang package timeperiodsR.

Kung interesado ka sa wikang R, inaanyayahan kita na mag-subscribe sa aking telegram channel R4marketing, kung saan nagbabahagi ako ng mga kapaki-pakinabang na materyales araw-araw tungkol sa paggamit ng wikang R sa paglutas ng iyong mga pang-araw-araw na problema.

Pinagmulan: www.habr.com

Magdagdag ng komento