Пользовательские выходные дни
Иногда помимо официальных выходных дней вам может понадобиться выделить собственные дополнительные выходные дни, например ваш отпуск.
Пакет timeperiodsR даёт вам такую возможность с помощью опции или переменной среды.
В опцию timeperiodsR.custom_day_offs вы можете передать вектор с датами которые будут помечены как дополнительные выходные дни, такие дни в компоненте dayoffs_marks будут помечены значением 3.
Также вы можете задать переменную среды TPR_CUSTOM_DAY_OFFS, в которой укажите даты в формате ГГГГ-ММ-ДД разделённые запятыми или точками с запятой.
Таким образом вы можете помечать дополнительные выходные дни.
options("timeperiodsR.custom_day_offs" = c("2020-01-14", "2020-01-15", "2020-01-16", "2020-01-17", "2020-02-12"))
tm <- this_month("2020-01-01")
# получить ваши пользовательские выходные которые входят в текущий период
tm$custom_day_offs
# пользовательские выходные будут помечены 3
tm$dayoffs_marks
Assets
2
selesnow
released this
Значительно расширен функционал пакета и в целом класс tpr.
Расширение класса tpr
В пакет интегрирован API производственного календаря isDayOff(). За счёт чего был значительно расширен класс tpr.
Опции
По умолчанию в пакете нет дополнительных компонентов, для их активации вам необходимо активировать следующие опции:
options("timeperiodsR.official_day_offs" = TRUE,
"timeperiodsR.official_day_offs_country" = "ru",
"timeperiodsR.official_day_offs_pre" = 1)
После чего в классе tpr вам будут доступны следующие компоненты:
- official_workdays - Официальные рабочие дни;
- official_first_workday - Первый официальный рабочий день;
- official_last_workday - Последний официальный рабочий день;
- official_day_offs - официальные выходные дни в выбранной стране, по умолчанию России;
- dayoffs_marks - пометки о том, какой статус имеет день в официальном календаре страны.
Переменные среды
Так же в пакеты была добавленна поддержка переменных среды для активации новых компонентов:
- TPR_DAY_OFFS - TRUE, для активации дополнительных компонентов;
- TPR_COUNTRY - Страна: ru, ua, by или kz;
- TPR_PRE - Включать в компонент official_day_offs сокращённые рабочие дни, в компоненте dayoffs_marks они будут помечены числом 2.
Новая функция
Функция check_dayoffs() позволяет вам проверить любую дату, вектор дат или объект класса tpr и получить пометку о том какой статус выбранные даты имеют в официальном календаре.
Документация
Более подробно обо всём функционале можно узнать в виньетке: vignette("tpr_intro", package = "timeperiodsR")
timeperiodsR 0.4.0
Дата: 2019-12-27
-
Расширен класс tpr, добавлены следующие компоненты
- workdays - вектор состоящий из будний дней входящих в период
- weekends - вектор состоящий из выходных дней входящих в период
- first_workday - первый будний день периода
- last_workday - последний будний день периода
- first_weekend - первый выходной день периода
- last_weekend - последний выходной день периода
- workdays_length - количество будних дней в периоде
- weekends_length - количество выходных дней в периоде
-
Добавлены новые методы
- workdays - получить вектор будних дней периода
- weekends - получить вектор выходных дней периода
- first_workday - получить первый будний день периода
- last_workday - получить последний будний день периода
- first_weekend - получить первый выходной день периода
- last_weekend - получить последний выходной день периода
- workdays_length - получить количество будних дней в периоде
- weekends_length - получить количество выходных дней в периоде
-
Аргумент part также теперь принимает больше значений
- start
- end
- length
- sequence
- workdays
- weekends
- first_workday
- last_workday
- first_weekend
- last_weekend
- workdays_length
- weekends_length
Assets
2
selesnow
released this
В версии timeperiodsR расширен список компонентов класса tpr, и соответственно появились новые методы для их извлечения.
Подробности
-
Расширен класс tpr, добавлены следующие компоненты
- workdays - вектор состоящий из будних дней входящих в период
- weekends - вектор состоящий из выходных дней входящих в период
- first_workday - первый будний день периода
- last_workday - последний будний день периода
- first_weekend - первый выходной день периода
- last_weekend - последний выходной день периода
- workdays_length - количество будних дней в периоде
- weekends_length - количество выходных дней в периоде
-
Добавлены новые методы
- workdays - получить вектор будних дней периода
- weekends - получить вектор выходных дней периода
- first_workday - получить первый будний день периода
- last_workday - получить последний будний день периода
- first_weekend - получить первый выходной день периода
- last_weekend - получить последний выходной день периода
- workdays_length - получить количество будних дней в периоде
- weekends_length - получить количество выходных дней в периоде
-
Аргумент part также теперь принимает больше значений
- start
- end
- length
- sequence
- workdays
- weekends
- first_workday
- last_workday
- first_weekend
- last_weekend
- workdays_length
- weekends_length
Пример работы с новыми компонентами и методами
# install.packages("devtools")
# devtools::install_github("selesnow/timeperiodsR")
library(timeperiodsR)
# получаем прошлый месяц
pm <- previous_month()
# компоненты
pm$start # начало периода
pm$end # завершения периода
pm$length # длительность периода
pm$sequence # вся последовательность дат
pm$weekdays # буднии дни в периоде
pm$weekends # выходные дни в периоде
pm$first_weekday # первый будний день периода
pm$last_weekday # последний будний день периода
pm$first_weekend # первый выходной день периода
pm$last_weekday # последний выходной день периода
pm$workdays_length # количество будних дней в периоде
pm$weekend_length # количество выходных дней в периоде
# методы
weekdays(pm) # будние дни
first_weekday(pm) # первый будний
last_weekday(pm) # последний будний
weekends(pm) # выходные дни
first_weekend(pm) # первый выходной день
last_weekend(pm) # последний выходной
workdays_length(pm) # количество будних дней в периоде
weekend_length(pm) # количество выходных дней в периоде
start(pm) # начало периода
end(pm) # завершения периода
length(pm) # длительность периода
seq(pm) # вся последовательность дат
Assets
2
selesnow
released this
- У пакета появился видео мануал.
- Добавлена функция
as_timeperiod(), которая позволяет преобразовать строковый вектор, или вектор содержащий даты в объект класса tpr. - Дописана и отредактирована виньетка к пакету.
Assets
2
selesnow
released this
В этом релизе были оптимизированы старые функции пакета, теперь все они под капотом используют функцию custom_period() для создания объектов класса tpr.
Но основная часть доработок и расширения функционала пакета timepriodsR это операторы.
В timeperiodsR есть несколько операторов.
- %.in% - проверяет вхождение одного вектора дат, или объекта класса tpr в другой, и возвращает логический вектор.
- %left_out% - сравнивает два объекта класса tpr, и возвращает значение из левого, которые отсутствуют в правом.
- %left_in% - сравнивает два объекта класса tpr, и возвращает даты из левого объекта которые входят в правый.
- %right_out% - сравнивает два объекта класса tpr, и возвращает значение из правого, которые отсутствуют в левом.
- %right_in% - сравнивает два объекта класса tpr, и возвращает даты из правого объекта которые присутствуют в левом.
Из представленного описания возможно сложно понять зачем эти операторы нужны, и как именно они работают. Поэтому рассмотрим несколько примеров.
Сначала создадим два объекта tpr класса, относительно 7 ноября 2019 года. Один будет соответствовать текущему месяцу, а второй предыдущей неделе.
period1 <- this_month("2019-11-07")
period2 <- previous_week("2019-11-07")
print(period1)
print(period2)
В таком случае первый период содержит даты с 1 по 30 ноября, а второй с 28 октября по 3 ноября. Т.е. частично эти два периода пересекаются и мы можем фильтровать один из используя значения другого.
period1 %left_in% period2 # получить даты из period1 которые входят в period2
period1 %left_out% period2 # получить даты из period1 которые не входят в period2
period1 %right_in% period2 # получить даты из period2 которые входят в period1
period1 %right_out% period2 # получить даты из period2 которые не входят в period2
Такие операторы фильтрации удобно использовать например при проверке данных в базе за какой-то период, в тех случаях когда вы наполняете базу данными из внешних источников на ежедневной основе.
К примеру вы каждый день запрашиваете данные из API Google Analytics, и записываете их в базу. При этом API периодически может давать сбой, и за какой-то день в вашей базе будут отсутствовать данные, тогда вы можете определить проверочный период, например предыдущие 30 дней, с помощью команды last_n_days(n = 30). Далее запрашивать данные за этот из вашей СУБД. После, с помощью приведённых выше операторов фильтрации убрать из общего 30 дневного периода даты которые пристукают в базе, и по оставшимся датам подгрузить данные.
Пример
library(DBI)
library(timesperiodsR)
library(stringr)
# подключение к базе
con <- dbConnect()
# проверочный период в 30 дней
test_days <- last_n_days(n = 30)
# запрашиваем данные из базы
sql <- str_interp("SELECT * FROM table WHERE date BETWEEN '${test_days$start}' AND ''${test_days$end}")
db_data <- dbGetQuery(con, sql)
# получаем даты за которые в базе отсутвуют данные
out_dates <- db_data$date %left_out% test_days
# циклом проходимся по отсутвующим датам
for ( date in out_dates ) {
# тело цикла
....
}
Assets
2
selesnow
released this
Первый релиз пакета.