Зачастую при создании скриптов которые в последвии будут запускаться по рассписанию нам необходимо определить период, как правило таким периодом может быть прошлая неделя, прошлый месяц, какое то количество прошлых дней. Пакет timeperiodsR
предоставляет вам набор функций которые автоматически будут вычислять такой период от какой либо базовой даты.
Текущая версия пакета состоит из 24 функций, по названию каждой из функций можно определить какой временной интервал она возвращает. Название состоит из префикса last
/ previous
/ this
/ next
и временной единицы day
/ week
/ month
/ quarter
/ year
. Нижнее подчёркивание _
является разделителем слов в названиях функций.
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()
Любая из функций пакета возвращает объект класса tpr
состоящий из следующих компонентов:
В функциях пакета timeperiodsR присутвуют следующие аргументы:
Пакет timeperiodsR
имеет несколько методов, позволяющих вам извлекать некоторые элементы объектов класса tpr.
seq
- получить последовательность дат из объекта класса tpr;length
- получить длительность объекта класса tpr в днях;start
- получить первую дату из объекта класса tpr;end
- получить последнюю дату из объекта класса tpr;print
- вывести в консоль информацию о периоде содержащемся в объекте класса tpr.Функции блока last_n_*()
позволяют вам получить прошлый период с заданным количеством временных единиц.
Вместо *
подставьте один из нужных вам временных интервалов: days, weeks, months, quarters, years
Например, допустим, что сегодня 26 сентября 2019 года и вам необходимо получить 2 прошлые недели то используйте функцию last_n_weeks()
:
##
## ---------------------
## Welcome to timeperiodsR version 0.2.0
##
## Author: Alexey Seleznev (Head of analytics dept at Netpeak).
## Telegram channel: https://t.me/R4marketing
## Email: selesnow@gmail.com
## Blog: https://alexeyseleznev.wordpress.com
## Facebook: https://facebook.com/selesnown
## Linkedin: https://www.linkedin.com/in/selesnow
##
## Type ?timeperiodsR for the main documentation.
## The github page is: https://github.com/selesnow/timeperiodsR/
##
## Suggestions and bug-reports can be submitted at: https://github.com/selesnow/timeperiodsR/issues
## Or contact: <selesnow@gmail.com>
##
## To suppress this message use: suppressPackageStartupMessages(library(timeperiodsR))
## ---------------------
2 прошлые недели
Код захватит даты с 9 по 22 сентября включительно.
После чего у вас появится объект last2weeks класса tpr
. Из него вы легко можете получить начальную или конечную дату периода, а так же всю последовательность дат которая вошла в этот период, или количество дней вошедших в период.
## [1] "2019-10-28"
## [1] "2019-10-28"
## [1] "2019-11-10"
## [1] "2019-11-10"
## [1] "2019-10-28" "2019-10-29" "2019-10-30" "2019-10-31" "2019-11-01"
## [6] "2019-11-02" "2019-11-03" "2019-11-04" "2019-11-05" "2019-11-06"
## [11] "2019-11-07" "2019-11-08" "2019-11-09" "2019-11-10"
## [1] "2019-10-28" "2019-10-29" "2019-10-30" "2019-10-31" "2019-11-01"
## [6] "2019-11-02" "2019-11-03" "2019-11-04" "2019-11-05" "2019-11-06"
## [11] "2019-11-07" "2019-11-08" "2019-11-09" "2019-11-10"
## [1] 14
## [1] 14
Во всех функциях предназначенных для работы с неделями т.е. last_n_weeks()
, previous_week()
, this_week()
, next_week()
, next_n_weeks()
присутвует аргумент week_start, с помощью которого можно указать день недели который будет являться её началом. По умолчанию неделя начинается с понедельника, т.е. week_start = 1
, но вы можете задать и любой другой день:
Т.е. если вы хотите получить 2 предыдущие недели отталкиваясь от 26 сентября, и при этом необходимо считать началом неделеи воскресенье то используйте следующий код:
Две предыдущие недели, начало недели воскресенье
Функции блока previous_*()
позволяют вам получить прошлый период со смещением на заданное количеством временных единиц. Т.е. например получить позапрошлую неделю.
Вместо *
подставьте один из нужных вам временных интервалов: week, month, quarter, year
Допустим нам необходимо получить позапрошлую неделю отталкиваясь от 26 сентября 2019 года, началом недели должен быть понедельник
Позапрошлая неделя
Функции блока this_*()
позволяют вам получить текущий период.
Вместо *
подставьте один из нужных вам временных интервалов: week, month, quarter, year
Если вам необходимо получить первую и последнюю дату текущего месяца, и всю последовательность дат которые в него входят то используйте следующий код:
##
## Time period: from 1 Ноябрь of 2019, пятница to 30 Ноябрь of 2019, суббота
Текущий месяц
Т.е. если сегодня 26 сентября 2019 года функция this_month()
захватит весь сентябрь 2019 года.
Функции блока next_*()
противоположный функциям блока previous_*()
. Т.е. позволяют вам получить будущий период со смещением на заданное количеством временных единиц. Т.е. например получить следующую неделю от 12 сентября.
Вместо *
подставьте один из нужных вам временных интервалов: week, month, quarter, year
Следующая неделя
Блок next_n_*
позволяет создать период обратный от того, что создают функции блока last_n_*
, т.е. получить будущий период с заданным количеством временных единиц.
Вместо *
подставьте один из нужных вам временных интервалов: days, weeks, months, quarters, years
Например если вам необходимо получить 5 следующих дней воспользуйтесь следующим кодом.
Данная функция позволяет создавать объект класса tpr с любым произвольным периодом.
В timeperiodsR
есть несколько операторов.
Из представленного описания возможно сложно понять зачем эти операторы нужны, и как именно они работают. Поэтому рассмотрим несколько примеров.
Сначала создадим два объекта tpr класса, относительно 7 ноября 2019 года. Один будет соответвовать текущему месяцу, а второй предыдущей неделе.
##
## Time period: from 1 Ноябрь of 2019, пятница to 30 Ноябрь of 2019, суббота
##
## Time period: from 28 Октябрь of 2019, понедельник to 3 Ноябрь of 2019, воскресенье
В таком случае первый период содержит даты с 1 по 30 ноября, а второй с 28 октября по 3 ноября. Т.е. частично эти два периода пересекаются и мы можем фильтровать один из используя значения другого.
## [1] "2019-11-01" "2019-11-02" "2019-11-03"
## [1] "2019-11-04" "2019-11-05" "2019-11-06" "2019-11-07" "2019-11-08"
## [6] "2019-11-09" "2019-11-10" "2019-11-11" "2019-11-12" "2019-11-13"
## [11] "2019-11-14" "2019-11-15" "2019-11-16" "2019-11-17" "2019-11-18"
## [16] "2019-11-19" "2019-11-20" "2019-11-21" "2019-11-22" "2019-11-23"
## [21] "2019-11-24" "2019-11-25" "2019-11-26" "2019-11-27" "2019-11-28"
## [26] "2019-11-29" "2019-11-30"
## [1] "2019-11-01" "2019-11-02" "2019-11-03"
## [1] "2019-10-28" "2019-10-29" "2019-10-30" "2019-10-31"
Такие операторы фильтрации удобно использовать например при проверке данных в базе за какой то период, в тех случаях когда вы наполняете базу данными из внешних источников на еждневной основе.
К примеру вы каждый день запраиваете данные из API Google Analytics, и записываете их в базу. При этом API периодически может давать сбой, и за какой то день в вашей базе будут отсутвовать данные, тогда вы можете определить проверочный период, например предыдущие 30 дней, с помощью команды last_n_days(n = 30)
. Далее запрашивать данные за этот из вашей СУБД. После, с помощью приведённых выше операторов фильтрации убрать из общего 30 дневного периода даты которые пристувуют в базе, и по оставшимся датам подгрузить данные.