我想知道有没有办法像这样转换日期 "20160101q"中的"2016-01-8",表示2016年1月上半月或 例如,"20160102q"中的"20160127"是指2016年1月下半月,提前感谢您?
这是一个使用data.table
和lubridate
包的解决方案。
它使用lubridate::days_in_month()
-函数来确定日期月份中的天数。这是必要的,因为 2 月(通常(有 28 天,所以 2 月 15 日 --> 02q。但是一月有31天,所以1月的第15天-->01q。
计算 q-周期的逻辑是:
If day_number / number_of_days_in_month > 0.5 --> q periode = 02q,
else q_period --> 01q.
然后使用paste0
命令在 deq_date
-column 中创建文本。sprintf()
用于为个位数的月份数添加前导零。
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
您可以尝试使用mutate和paste0,首先将日期分解为日,月和年。 然后创建一个变量,说明我们是在上半月还是下半月,然后粘贴月、年的刺痛文本以及包含"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)