12

我有一个 csv,其中包含大约 200 万行日期字符串,格式如下:

2012/11/13 21:10:00 

让我们称之为csv$Date.and.Time

我想尽快将这些日期(及其随附数据)转换为 xts

我已经编写了一个脚本,可以很好地执行转换(见下文),但它非常慢,我想尽可能加快速度。

这是我目前的方法。有没有人对如何使这个更快有任何建议?

 dt <- as.POSIXct(csv$Date.and.Time,tz="UTC")

idx <- format(dt,tz=z,usetz=TRUE)

因此脚本将这些日期字符串转换为POSIX.ct. 然后它使用format(z是代表我要转换的 TZ 的变量) 进行时区转换。然后,我定期xts调用以将其与 csv 中的其余数据一起设为 xts 系列。

这 100% 有效。它只是非常非常缓慢。我试过并行运行它(它什么也没做;如果有的话,它会使情况变得更糟)。“慢”是什么意思?

 user    system   elapsed 
155.246  16.430 171.650 

那是在 3GhZ、16GB ram 2012 mb pro 上。我可以在 Win7 机器上使用 32GB RAM 的类似处理器获得大约一半

我敢肯定有人有更好的主意-我愿意接受Rcpp等方面的建议。但是,理想情况下,该解决方案适用于 csv 而不是其他方法,例如设置数据库。话虽如此,我将通过任何能提供最快转换的方法来做到这一点。

我会非常感谢任何帮助。提前致谢。

4

2 回答 2

21

您需要 Simon 提供的小而简单的fasttime包,它以最快的方式做到这一点——不调用时间解析函数,而只使用 C 级字符串函数。

它不支持像strptime. 事实上,它甚至没有格式字符串。但是格式良好的 ISO 格式变体yyyy-mm-dd hh:mm:ss.fff可以正常工作,而且您的/分隔符也可以正常工作。

于 2012-11-30T04:09:38.850 回答
3

尝试使用lubridate- 它使用正则表达式进行所有日期时间解析,因此不仅速度更快,而且更灵活。

于 2012-11-30T15:17:55.273 回答