- это решение, использующее пакеты data.table
и lubridate
.
Использует функцию lubridate::days_in_month()
, чтобы определить количество дней в месяце даты. Это необходимо, поскольку в феврале (обычно) 28 дней, поэтому 15 февраля -> 02q. Но в январе 31 день, поэтому 15 января -> 01q.
Лог c для расчета q-периода:
If day_number / number_of_days_in_month > 0.5 --> q periode = 02q,
else q_period --> 01q.
Затем команда paste0
используется для создания текста в столбце de q_date
. sprintf()
используется для добавления начального нуля для однозначных чисел git.
library(data.table)
library(lubridate)
#sample data
data <- data.table( date = as.Date( c("2019-12-30", "2020-01-15", "2020-02-15", "2020-02-14") ) )
# date
# 1: 2019-12-30
# 2: 2020-01-15
# 3: 2020-02-15
# 4: 2020-02-14
#if the day / #days of month > 0.5, date is in q2, else q1
data[ lubridate::mday(date) / lubridate::days_in_month(date) > 0.5,
q_date := paste0( lubridate::year(date), sprintf( "%02d", lubridate::month(date) ), "02q" ) ]
data[ is.na( q_date ),
q_date := paste0( lubridate::year(date), sprintf( "%02d", lubridate::month(date) ), "01q" ) ]
# date q_date
# 1: 2019-12-30 20191202q
# 2: 2020-01-15 20200101q
# 3: 2020-02-15 20200202q
# 4: 2020-02-14 20200201q