如何在data.table中最有效地重构字符串以实现快速时间

时间:2015-04-23 15:28:29

标签: r data.table

我有一个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节省可忽略不计?

1 个答案:

答案 0 :(得分:2)

首先使用sub重新排序字符串,是的,我认为这比使用基础as.POSIXct要快得多:

DT[, DateTime := fastPOSIXct(sub('(\\d*)/(\\d*)/(\\d*) (.*)', '\\3-\\1-\\2 \\4', DateTime))]

您也可以使用substr代替正则表达式来提高速度,但它会更加混乱。