R күндермен жұмыс (негізгі мүмкіндіктер, сондай-ақ майлау және уақыт кезеңдеріR пакеттері)

Ағымдағы күнді кез келген бағдарламалау тілінде, «Hello world!» операциясына баламалы операцияны алыңыз. 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() күнді екі форматта қабылдайды: ЖЖЖЖ-АА-КК немесе ЖЖЖЖ/АА/КК.
Деректер жинағында басқа пішімдегі күндер болса, аргументті пайдалана аласыз format.

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

формат кез келген уақыт аралығын және оның пішімін білдіретін жол түріндегі операторларды қабылдайды; ең жиі қолданылатын мәндер төмендегі кестеде көрсетілген:

Пішім
сипаттамасы

%d
Айдағы күн саны

%a
Аптаның күні атауының аббревиатурасы

%A
Апта күнінің толық атауы

%w
Апта күнінің саны (0-6, мұнда 0 жексенбі)

%m
Екі таңбалы ай белгісі (01-12)

%b
Ай атауының аббревиатурасы (apr, mar, …)

%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 дәуірінің басынан бергі секундтар санын сақтайды (31 жылдың 1969 желтоқсанынан 1 жылдың 1970 қаңтарына дейін түн ортасы (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 аргументіне берілген деректер ұсынылатын күн пішімінің сипаттамасы;
  • Origin — Санды 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 Мүмкін 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 жылдың қыркүйегінде 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()

Осыдан кейін сізде объект болады ерте сыныбы tpr, одан келесі компоненттерді оңай алуға болады:

  • кезеңнің басталу күні, біздің мысалда бұл соңғы ай
  • кезеңнің аяқталу күні
  • кезеңге енгізілген күндер саны
  • кезеңге енгізілген күндердің реттілігі

Сонымен қатар, компоненттердің әрқайсысын әртүрлі жолдармен алуға болады:

# первый день периода
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 қыркүйек аралығындағы кезең.

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 жылдың мамыры болды.

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

пікір қалдыру