我有一个data.table,其中包含两列中的字符,如下所示:
01/01/2014 | 00:30
02/01/2014 | 01:00
03/01/2014 | 01:30 etc
此数据集的长度各不相同,但每次运行脚本时容易超过300,000行。最后我知道这个脚本需要处理30,000,000行的数据集。
我目前paste
采用以下形式:
DT[, DateTime := paste(Date, Time)
导致:
01/01/2014 00:30
02/01/2014 01:00
03/01/2014 01:30 etc
然后我使用as.POSIXct
将其转换为POSIX日期:
DT[, DateTime:= as.POSIXct(x = DateTime, format = "%d/%m/%Y %H:%M")]
这很好用,正确转换字符,很大程度上我相信,因为我设置格式参数以匹配它所输入的字符串的结构。
但是,我想使用fasttime
包,但是存在一个固有的问题,即它不支持输入format
参数。因此,当我跑:
DT[, DateTime := fastPOSIXct(x = DateTime)]
fasttime
必须将我的数据解释为“解释顺序是固定的:年,月,日,小时,分钟,秒。”输出会像:
2006/07/07 00:30
2007/07/07 01:00
2008/07/07 01:30 etc
因此,似乎我必须使用as.POSIXct
,或者找到一种方法来将字符串操作为正确的顺序。
允许我使用fasttime
的最有效方法是什么?我该如何重新排序字符串以匹配?您是否希望重新排序字符串以便使用fasttime
,或者更正要求纠正字符串会使fasttime
节省可忽略不计?
答案 0 :(得分:2)
首先使用sub
重新排序字符串,是的,我认为这比使用基础as.POSIXct
要快得多:
DT[, DateTime := fastPOSIXct(sub('(\\d*)/(\\d*)/(\\d*) (.*)', '\\3-\\1-\\2 \\4', DateTime))]
您也可以使用substr
代替正则表达式来提高速度,但它会更加混乱。