R语言如何操作datetime列在dataframe中新增日期偏移行
R股票数据日期扩展解决方案
依赖包
需用到dplyr做数据操作、lubridate处理日期,未安装可先执行安装:
install.packages(c("dplyr", "lubridate"))
核心实现代码
示例数据中showdate字段存在换行、空格问题,代码中已内置清洗逻辑:
library(dplyr) library(lubridate) # 清洗日期格式 sanitised <- sanitised %>% mutate(showdate = gsub("\\s|\\n", "", showdate), # 移除所有空格、换行符 showdate = ymd(showdate)) # 转成标准日期格式 # 扩展行逻辑 result <- sanitised %>% rowwise() %>% reframe( offset = c(-1, 0, 1), # 三个时间偏移量:前1天、当天、后1天 symbol = symbol, showdate = showdate + days(offset), # 仅原日期行保留其余字段值,新增行其余字段留空 across(-c(symbol, showdate, offset), ~ ifelse(offset == 0, ., "")) ) %>% select(-offset) %>% # 删除辅助计算的偏移量字段 arrange(symbol, showdate) # 按股票代码、日期排序,方便后续分析
效果说明
- 输出行数为原表的3倍,每一条原记录对应三条连续日期的记录
- 原日期对应的记录所有字段值不变,前后两天的记录仅保留
symbol和计算后的showdate,其余字段为空 - 自动处理跨月、跨年的日期计算,无需手动判断月份天数
大数据量可选方案
如果数据量超过10万行,推荐用data.table方案,运行效率更高:
library(data.table) library(lubridate) setDT(sanitised) # 清洗日期 sanitised[, showdate := ymd(gsub("\\s|\\n", "", showdate))] # 扩展行并处理字段 result <- sanitised[, .(offset = -1:1, symbol = symbol), by = seq_len(nrow(sanitised))] %>% .[sanitised, on = "seq_len", nomatch = 0] %>% .[, showdate := showdate + days(offset)] %>% .[offset != 0, (setdiff(names(sanitised), c("symbol", "showdate"))) := ""] %>% .[, .SD, .SDcols = names(sanitised)]
内容的提问来源于stack exchange,提问作者ML33M
相关产品推荐
相关产品推荐

