【发布时间】:2018-02-15 02:49:38
【问题描述】:
我有一个大型数据集,其中包含许多包含两种不同格式日期的列:
"1996-01-04" "1996-01-05" "1996-01-08" "1996-01-09" "1996-01-10" "1996-01-11"
和
"02/01/1996" "03/01/1996" "04/01/1996" "05/01/1996" "08/01/1996" "09/01/1996"
在这两种情况下,class() 都是“字符”。由于数据集有很多行(450万),我正在寻找一种高效的data.table转换方法。现在,我使用这个自建函数:
convert_to_date <- function(in_array){
tmp <- try(as.Date(in_array, format = "%d/%m/%Y"),TRUE)
if (all(!is.na(tmp)) & class(tmp) != "try-error"){
return(tmp)
} else{
tmp2 <- try(as.Date(in_array),TRUE)
if (all(!is.na(tmp2)) & class(tmp2) != "try-error"){
return(tmp2)
} else{
return(in_array)
}
}
}
然后我用它转换我需要的列(data.table DF)
DF[,date:=convert_to_date(date)]
但是,这仍然非常慢(每列将近 45 秒)。
有什么方法可以通过 data.table 方法优化它吗?到目前为止,我还没有找到更好的方法,所以我会感谢任何提示。
P.S:为了更好的可读性,我将函数“外包”到了第二个文件,并在我的主程序中获取了它。这对 R 中的计算速度有(负面)显着影响吗?
【问题讨论】:
-
data.table有as.IDate() -
有趣的问题,但您必须为此发布可重现的示例。
-
This answer 包含将字符日期转换为
Date类的各种方法和包的基准。 -
@docendodiscimus 谢谢,但根据我的个人经验 as.Date() 和 as.IDate() 对于 data.table 对象的工作速度相当快,我还没有运行基准测试,但它确实没有“感觉”更快,所以我试图在其他地方破解我的代码。
-
仅供参考,IDate 的加速不在转换中;它存在于之后的所有内容中(过滤、加入)。通常使用整数来做这类事情会比浮点数更快。
标签: r date data.table