You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效从非标准日期数据中提取年、月、日列?

高效提取非标准日期的年、月、日列

针对十万行以上的大数据集,逐行循环的sapply方法效率低下,推荐以下两种向量化/高效处理方案:

方案1:使用tidyr::separate(tidyverse生态)

separate是专门用于拆分列的函数,底层为向量化实现,处理速度远快于逐行循环:

library(tidyr)

dates_df <- data.frame(dates = c("1985-03-23", "", "1983", "1984-01"))

# 拆分dates列,缺失部分用NA填充,保留原列
dates_df <- separate(dates_df, col = dates, into = c("year", "month", "day"), 
                     sep = "-", fill = "right", remove = FALSE)

# 将空字符串转为NA,匹配期望结果
dates_df[dates_df == ""] <- NA

该方法代码简洁,适合习惯tidyverse工作流的用户。

方案2:使用data.table::tstrsplit(大数据最优选择)

data.table专为大数据处理优化,tstrsplit是其内置的快速字符串拆分函数,在十万甚至百万行数据上的处理速度会比tidyr更有优势:

library(data.table)

dates_df <- data.frame(dates = c("1985-03-23", "", "1983", "1984-01"))

# 转换为data.table对象
setDT(dates_df)

# 拆分dates列并生成新列
dates_df[, c("year", "month", "day") := tstrsplit(dates, "-", fixed = TRUE)]

# 空值转NA
dates_df[dates == "", c("year", "month", "day") := NA]

性能优势说明

原代码中的sapply本质是逐行遍历处理,属于低效的循环操作;而separate和tstrsplit都是向量化操作,底层通过C语言实现批量处理,避免了逐行循环的性能损耗,在大数据集上的速度提升非常明显。

内容的提问来源于stack exchange,提问作者flee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:20:31