如何基于yearqtr类型数据生成季度首尾月份日期列?
实现方法:将yearqtr列拆分成交替的季度起始/结束日期
基于你已经加载的dplyr、zoo和data.table包,这里有两种简洁的实现方式,完美匹配你想要的start_at(季度首月1号)和end_at(季度末月1号)格式:
方法1:用dplyr + zoo(延续你原有的管道风格)
先回顾你的初始数据处理步骤,然后直接在管道里添加新列的计算:
library(data.table) library(dplyr) library(zoo) # 你的初始数据转换 data = data.frame(x = c("2017-12-01", "2017-12-01", "2017-11-01", "2017-11-01", "2017-10-01", "2017-10-01")) data <- data %>% mutate(x = as.Date(x, format = "%Y-%m-%d"), x = as.yearqtr(x)) # 拆分start_at和end_at data <- data %>% mutate( # frac=0 指定取季度的第一天(即首月1号) start_at = as.Date(x, frac = 0), # 提取季度首月+2得到末月,拼接成日期格式 end_at = as.Date(paste0(year(x), "-", month(x) + 2, "-01")) ) %>% select(start_at, end_at) # 只保留需要的列
方法2:用data.table(适合大数据集的高效操作)
如果你习惯用data.table的语法,也可以这样写:
setDT(data) # 把data.frame转成data.table data[, `:=`( start_at = as.Date(x, frac = 0), end_at = as.Date(paste0(year(x), "-", month(x) + 2, "-01")) )][, x := NULL] # 删除原x列
效果验证
运行后,你的数据会生成符合预期的结果:所有对应Q4 2017的行,start_at为2017-10-01,end_at为2017-12-01,完全匹配你给出的示例格式。
内容的提问来源于stack exchange,提问作者Greconomist
相关产品推荐
相关产品推荐

