Преобразование ежедневных дат в две недели в R - PullRequest
0 голосов
/ 05 февраля 2020

Я хотел бы знать, есть ли способ преобразовать даты, подобные этой, «2016-01-8» в «20160101q», что означает первую половину января 2016 года, или «20160127» в «20160102q», что означает вторую половину Январь 2016 например и заранее спасибо?

Ответы [ 2 ]

0 голосов
/ 05 февраля 2020

- это решение, использующее пакеты 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
0 голосов
/ 05 февраля 2020

вы можете попробовать с помощью mutate и paste0, сначала вы разбиваете дату на день, месяц и год. затем создайте переменную, которая говорит, что мы находимся в первой или второй половине месяца, затем вставьте текст sting месяца, года и переменную, содержащую «01q» или «02q» в зависимости от периода

date<- c("2016-01-8",
"2016-01-27")
id <- c(1,2)
x <- as.data.frame(cbind(id, date)) 

library(tidyverse)
library(lubridate)
x = x %>% 
  mutate(date = ymd(date)) %>% 
  mutate_at(vars(date), funs(year, month, day))
x$half <- "01q"
x$half[day>15] <- "02q"
paste0(x$year,x$month,x$half)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...