Gweithio gyda dyddiadau yn R (galluoedd sylfaenol, yn ogystal â'r pecynnau lubridate a timeperiodsR)

Sicrhewch y dyddiad cyfredol mewn unrhyw iaith raglennu, gweithrediad sy'n cyfateb i "Helo fyd!" Nid yw'r iaith R yn eithriad.

Yn yr erthygl hon, byddwn yn edrych ar sut mae gweithio gyda dyddiadau yn gweithio yng nghystrawen sylfaenol yr iaith R, a hefyd yn edrych ar sawl pecyn defnyddiol sy'n ehangu ei alluoedd wrth weithio gyda dyddiadau:

  • lubridate — pecyn sy'n eich galluogi i wneud cyfrifiadau rhifyddol rhwng dyddiadau;
  • timeperiodsR — pecyn ar gyfer gweithio gyda chyfyngau amser a'u cydrannau.

Gweithio gyda dyddiadau yn R (galluoedd sylfaenol, yn ogystal â'r pecynnau lubridate a timeperiodsR)

Cynnwys

Os oes gennych ddiddordeb mewn dadansoddi data, ac yn arbennig yr iaith R, efallai y bydd gennych ddiddordeb yn fy telegram и youtube sianeli. Mae'r rhan fwyaf o'r cynnwys wedi'i neilltuo i'r iaith R.

  1. Gweithio gyda dyddiadau mewn cystrawen R sylfaenol
    1.1. Trosi testun i ddyddiad
    1.2. Tynnu cydrannau dyddiad yn R sylfaenol
  2. Gweithio gyda dyddiadau gan ddefnyddio'r pecyn lubridate
    2.1. Trosi testun i ddyddiad gan ddefnyddio lubridate
    2.2. Tynnu cydrannau dyddiad gan ddefnyddio'r pecyn lubridate
    2.3. Gweithrediadau rhifyddeg gyda dyddiadau
  3. Gwaith symlach gyda chyfnodau, pecyn timeperiodsR
    3.1. Cyfnodau amser mewn cyfnodau amserR
    3.2. Hidlo fector o ddyddiadau gan ddefnyddio timeperiodsR
  4. Casgliad

Gweithio gyda dyddiadau mewn cystrawen R sylfaenol

Trosi testun i ddyddiad

Mae gan Basic R set o swyddogaethau ar gyfer gweithio gyda dyddiadau. Anfantais y gystrawen sylfaenol yw bod achos enwau swyddogaethau a dadleuon yn wasgaredig iawn ac nid oes ganddo bron unrhyw gysylltiad rhesymegol. Fodd bynnag, mae angen i chi wybod swyddogaethau sylfaenol yr iaith, felly byddwn yn dechrau gyda nhw.

Yn fwyaf aml wrth lwytho data i R, o ffeiliau csv, neu ffynonellau eraill, byddwch yn derbyn dyddiad fel testun. I drosi'r testun hwn i'r math cywir o ddata, defnyddiwch y ffwythiant 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"

Yn ddiofyn as.Date() yn derbyn dyddiad mewn dau fformat: BBBB-MM-DD neu BBBB/MM/DD.
Os yw eich set ddata yn cynnwys dyddiadau mewn rhyw fformat arall, gallwch ddefnyddio'r ddadl format.

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

Fformat yn derbyn gweithredwyr ar ffurf llinyn gan ddynodi unrhyw gyfwng amser a'i fformat; dangosir y gwerthoedd a ddefnyddir amlaf yn y tabl isod:

Fformat
Disgrifiad

%d
Rhif dydd yn y mis

%a
Talfyriad ar gyfer enw diwrnod yr wythnos

%A
Enw llawn y diwrnod o'r wythnos

%w
Nifer diwrnod yr wythnos (0-6, lle mae 0 yn ddydd Sul)

%m
Dynodiad mis dau ddigid (01-12)

%b
Talfyriad o enw’r mis (apr, mar, …)

%B
Enw mis llawn

%y
Dynodiad blwyddyn dau ddigid

%Y
Dynodiad blwyddyn pedwar digid

%j
Rhif y diwrnod yn y flwyddyn (001 - 366)

%U
Nifer yr wythnos yn y flwyddyn (00 - 53), dechrau'r wythnos Sul

%W
Rhif yr wythnos yn y flwyddyn (00 - 53), dechrau'r wythnos dydd Llun

Yn unol â hynny, “Medi 26, 2019” yw enw llawn y mis, y dyddiad a’r flwyddyn. Gellir disgrifio fformat y dyddiad hwn gan ddefnyddio gweithredwyr fel a ganlyn:"%B %d, %Y".

Ble:

  • %B — Enw llawn y mis
  • %d — Nifer y dydd yn y mis
  • %Y — Dynodiad blwyddyn pedwar digid

Wrth ddisgrifio fformat y dyddiad, mae'n bwysig cynnwys yr holl nodau ychwanegol o'ch llinyn, megis llinellau toriad, atalnodau, cyfnodau, bylchau, ac ati. Yn fy enghraifft, “Medi 26, 2019”, mae coma ar ôl y dyddiad, ac mae angen i chi hefyd roi coma yn y disgrifiad fformat:"%B %d, %Y".

Mae sefyllfaoedd pan fyddwch yn derbyn dyddiad sydd nid yn unig yn cyfateb i fformatau safonol (BBBB-MM-DD neu BBBB/MM/DD), ond hefyd mewn iaith sy'n wahanol i'r un diofyn a osodwyd ar eich system weithredu. Er enghraifft, fe wnaethoch chi lawrlwytho data lle nodir y dyddiad fel hyn: “Rhagfyr 15, 2019.” Cyn trosi'r llinyn hwn yn ddyddiad, mae angen ichi newid y locale.

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

Tynnu cydrannau dyddiad yn R sylfaenol

Nid oes llawer o swyddogaethau yn R sylfaenol sy'n eich galluogi i dynnu unrhyw ran o ddyddiad o wrthrych dosbarth dyddiad.

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

Yn ogystal â'r prif ddosbarth gwrthrychau dyddiad yn R sylfaenol mae 2 fath arall o ddata sy'n storio stamp amser: POSIXlt, POSIXct. Y prif wahaniaeth rhwng y dosbarthiadau hyn a dyddiad yw hynny yn ychwanegol at y dyddiad y maent yn storio amser.

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

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

# "POSIXct" "POSIXt"

Swyddogaeth Sys.time() yn dychwelyd y dyddiad a'r amser cyfredol yn y fformat POSIXct. Mae'r fformat hwn yn debyg o ran ystyr i UNIXTIME, ac yn storio nifer yr eiliadau ers dechrau'r oes UNIX (canol nos (UTC) o 31 Rhagfyr, 1969 i Ionawr 1, 1970).

Dosbarth POSIXlt mae hefyd yn storio'r amser a'r dyddiad, a'u holl gydrannau. Felly, mae'n wrthrych gyda strwythur mwy cymhleth, ond mae'n hawdd cael unrhyw gydran dyddiad ac amser ohono oherwydd mewn gwirionedd POSIXlt hwn rhestr.

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

Trosi data rhifol a thestun yn fformatau POSIX* a gyflawnir gan swyddogaethau as.POSIXct() и as.POSIXlt(). Mae gan y swyddogaethau hyn set fach o ddadleuon.

  • x — Rhif, llinyn neu wrthrych dosbarth dyddiad, y mae angen ei drosi;
  • tz - Parth amser, "GMT" rhagosodedig;
  • fformat — Disgrifiad o'r fformat dyddiad y cynrychiolir y data a drosglwyddwyd i'r ddadl x;
  • tarddiad — Fe'i defnyddir wrth drosi rhif i POSIX yn unig; rhaid i chi basio gwrthrych dyddiad ac amser y mae'r eiliadau'n cael eu cyfrif ohono yn y ddadl hon. Defnyddir yn nodweddiadol ar gyfer cyfieithu o UNIXTIME.

Os yw eich gwybodaeth dyddiad ac amser i mewn UNIXTIME, yna i'w trosi'n ddyddiad clir, darllenadwy, defnyddiwch yr enghraifft ganlynol:

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

Yn y tarddiad gallwch nodi unrhyw stamp amser. Er enghraifft, os yw eich data yn cynnwys y dyddiad a'r amser fel nifer yr eiliadau ers Medi 15, 2019 12:15 pm, yna i'w drosi i ddefnydd dyddiad:

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

Gweithio gyda dyddiadau gan ddefnyddio'r pecyn lubridate

lubridate Efallai mai dyma'r pecyn mwyaf poblogaidd ar gyfer gweithio gyda dyddiadau yn yr iaith R. Mae'n darparu tri dosbarth ychwanegol i chi.

  • hydoedd — hyd, h.y. nifer yr eiliadau rhwng dau stamp amser;
  • cyfnodau - mae cyfnodau yn eich galluogi i wneud cyfrifiadau rhwng dyddiadau mewn cyfnodau y gall pobl eu darllen: dyddiau, misoedd, wythnosau, ac ati;
  • cyfyngau - gwrthrychau sy'n darparu man cychwyn a gorffen mewn amser.

Mae gosod pecynnau ychwanegol yn yr iaith R yn cael ei wneud gan ddefnyddio'r swyddogaeth safonol install.packages().

Gosod y pecyn lubridate:

install.packages("lubridate")

Trosi testun i ddyddiad gan ddefnyddio lubridate

Nodweddion pecyn lubridate symleiddio'r broses o drosi testun yn ddyddiad yn sylweddol, a hefyd yn caniatáu ichi gyflawni unrhyw weithrediadau rhifyddol gyda dyddiadau ac amseroedd.

Bydd y swyddogaethau yn eich helpu i gael y dyddiad neu'r dyddiad a'r amser cyfredol today() и now().

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

I drosi llinyn i ddyddiad yn lubridate Mae yna deulu cyfan o swyddogaethau y mae eu henwau bob amser yn cynnwys tair llythyren, ac yn nodi dilyniant cydrannau dyddiad:

  • y - blwyddyn
  • m - mis
  • d - dydd

Rhestr o swyddogaethau ar gyfer trosi testun hyd yn hyn trwy lubridate

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

Rhai enghreifftiau ar gyfer trosi llinynnau i ddyddiadau:

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

Fel y gwelwch lubridate Mae'n llawer mwy effeithlon wrth adnabod disgrifiadau dyddiad fel testun, ac mae'n caniatáu ichi drosi testun yn gyfoes heb ddefnyddio gweithredwyr ychwanegol i ddisgrifio'r fformat.

Tynnu cydrannau dyddiad gan ddefnyddio'r pecyn lubridate

Hefyd yn defnyddio lubridate gallwch gael unrhyw gydran o ddyddiad:

dt <- ymd("2017 jan 21")

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

Gweithrediadau rhifyddeg gyda dyddiadau

Ond y swyddogaeth bwysicaf a sylfaenol lubridate yw'r gallu i gyflawni gweithrediadau rhifyddol amrywiol gyda dyddiadau.

Cyflawnir talgrynnu dyddiad gan dair swyddogaeth:

  • floor_date — talgrynnu i'r amser gorffennol agosaf
  • ceiling_date — talgrynnu i'r amser dyfodol agos
  • round_date - talgrynnu i'r amser agosaf

Mae dadl i bob un o'r swyddogaethau hyn unedsy'n caniatáu ichi nodi'r uned dalgrynnu: ail, munud, awr, diwrnod, wythnos, mis, deufis, chwarter, tymor, hanner blwyddyn, blwyddyn

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

Felly gadewch i ni ddarganfod sut i gael dyddiad sydd 8 diwrnod ar ôl y dyddiad cyfredol a gwneud cyfrifiadau rhifyddol amrywiol eraill rhwng y ddau ddyddiad.

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

Gwaith symlach gyda chyfnodau, pecyn timeperiodsR.

timeperiodsR — pecyn newydd ar gyfer gweithio gyda dyddiadau a gyhoeddwyd ar CRAN ym mis Medi 2019.

Gosod y pecyn timeperiodsR:

install.packages("timeperiodsR")

Y prif bwrpas yw pennu cyfnod amser penodol yn gyflym mewn perthynas â dyddiad penodol. Er enghraifft, gan ddefnyddio ei swyddogaethau gallwch yn hawdd:

  • Sicrhewch yr wythnos, mis, chwarter neu flwyddyn ddiwethaf yn R.
  • Sicrhewch nifer penodol o gyfnodau amser mewn perthynas â dyddiad, er enghraifft y 4 wythnos diwethaf.
  • Mae'n hawdd tynnu ei gydrannau o'r cyfwng amser canlyniadol: y dyddiad cychwyn a gorffen, nifer y dyddiau sydd wedi'u cynnwys yn yr egwyl, y dilyniant cyfan o ddyddiadau sydd wedi'u cynnwys ynddo.

Enw pob swyddogaeth pecyn timeperiodsR yn reddfol ac yn cynnwys dwy ran: cyfeiriad_egwyl, lle:

  • cyfeiriad lle mae angen i chi symud mewn perthynas â dyddiad penodol: last_n, blaenorol, hwn, nesaf, nesaf_n.
  • dros dro egwyl i gyfrifo'r cyfnod: diwrnod, wythnos, mis, chwarter, blwyddyn.

Set lawn o swyddogaethau:

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

Cyfnodau amser mewn cyfnodau amserR

Mae'r swyddogaethau hyn yn ddefnyddiol mewn achosion lle mae angen i chi adeiladu adroddiadau yn seiliedig ar ddata o'r wythnos neu'r mis diwethaf. I gael y mis diwethaf, defnyddiwch y swyddogaeth o'r un enw previous_month():

prmonth <- previous_month()

Ar ôl hynny bydd gennych wrthrych prmonth dosbarth tpr, y gellir cael y cydrannau canlynol ohonynt yn hawdd:

  • dyddiad cychwyn y cyfnod, yn ein hesiampl dyma'r mis olaf
  • dyddiad diwedd y cyfnod
  • nifer y diwrnodau sydd wedi'u cynnwys yn y cyfnod
  • dilyniant o ddyddiadau sydd wedi eu cynnwys yn y cyfnod

Ar ben hynny, gallwch chi gael pob un o'r cydrannau mewn gwahanol ffyrdd:

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

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

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

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

Gallwch hefyd gael unrhyw un o'r cydrannau gan ddefnyddio'r ddadl rhan, sy'n bresennol ym mhob un o'r swyddogaethau pecyn. Gwerthoedd posibl: dechrau, diwedd, dilyniant, hyd.

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

Felly gadewch i ni edrych ar yr holl ddadleuon sydd ar gael yn y swyddogaethau pecyn timeperiodsR:

  • x — Y dyddiad cyfeirnod y bydd y cyfnod amser yn cael ei gyfrifo ohono, y dyddiad cyfredol yn ddiofyn;
  • n — Nifer y cyfnodau a fydd yn cael eu cynnwys yn y cyfnod, er enghraifft y 3 wythnos flaenorol;
  • part — Pa gydran o'r gwrthrych tpr mae angen ichi gael, yn ddiofyn all;
  • week_start — Dim ond mewn ffwythiannau ar gyfer gweithio gydag wythnosau y mae'r ddadl yn bresennol, ac mae'n caniatáu ichi osod nifer y diwrnod o'r wythnos a ystyrir fel ei ddechrau. Yn ddiofyn, dydd Llun yw dechrau'r wythnos, ond gallwch chi osod unrhyw rai o 1 - Llun i 7 - Sul.

Felly, gallwch gyfrifo unrhyw gyfnod amser o'i gymharu â'r dyddiad cyfredol neu unrhyw ddyddiad penodol arall; dyma ychydig mwy o enghreifftiau:

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

Hydref 6 yw dydd Sul:
Gweithio gyda dyddiadau yn R (galluoedd sylfaenol, yn ogystal â'r pecynnau lubridate a timeperiodsR)

Mae arnom angen cyfnod, o gymharu â 6 Hydref, a fydd yn cymryd y 3 wythnos flaenorol. Heb gynnwys yr wythnos sy'n cynnwys Hydref 6 ei hun. Yn unol â hynny, dyma'r cyfnod rhwng Medi 9 a Medi 29.

Gweithio gyda dyddiadau yn R (galluoedd sylfaenol, yn ogystal â'r pecynnau lubridate a 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

Yn yr enghraifft hon, mae gennym ddiddordeb yn y mis a oedd 4 mis yn ôl, os ydym yn dechrau o 16 Medi, 2019, yna Mai 2019 oedd hi.

Hidlo fector o ddyddiadau gan ddefnyddio timeperiodsR

I hidlo dyddiadau i mewn timeperiodsR Mae yna nifer o weithredwyr:

  • %left_out% - yn cymharu dau wrthrych dosbarth tpr, ac yn dychwelyd y gwerth o'r un chwith sydd ar goll yn yr un cywir.
  • %left_in% - yn cymharu dau wrthrych o'r dosbarth tpr, ac yn dychwelyd y dyddiadau o'r gwrthrych chwith sydd wedi'u cynnwys yn yr un cywir.
  • % right_out% - yn cymharu dau wrthrych dosbarth tpr, ac yn dychwelyd y gwerth o'r un dde sydd ar goll o'r un chwith.
  • % right_in% - yn cymharu dau wrthrych o'r dosbarth tpr, ac yn dychwelyd dyddiadau o'r gwrthrych dde sy'n bresennol yn yr un chwith.

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

Yn y pecyn timeperiodsR mae un swyddogol, iaith Rwsieg Rhestr chwarae YouTube.

Casgliad

Archwiliwyd yn fanwl y dosbarthiadau o wrthrychau sydd wedi'u cynllunio yn yr iaith R ar gyfer gweithio gyda dyddiadau. Hefyd nawr gallwch chi berfformio gweithrediadau rhifyddeg ar ddyddiadau, a chael unrhyw gyfnodau amser yn gyflym gan ddefnyddio'r pecyn timeperiodsR.

Os oes gennych ddiddordeb yn yr iaith R, fe'ch gwahoddaf i danysgrifio i'm sianel telegram R4marchnata, lle byddaf yn rhannu deunyddiau defnyddiol yn ddyddiol am ddefnyddio'r iaith R wrth ddatrys eich problemau dyddiol.

Ffynhonnell: hab.com

Ychwanegu sylw