【问题标题】:Efficiently formatting date and time in large data sets in R - dplyr performance在 R 中有效地格式化大型数据集中的日期和时间 - dplyr 性能
【发布时间】:2014-11-07 04:56:43
【问题描述】:

这个问题是关于代码性能的。我有一个包含两列的数据框:

  • DATEMMDDYYYY 格式表示为数字
  • EPOCH 表示从午夜开始以 5 分钟为增量的时间。 EPOCH 计数从 0 开始 - 所以 00:00 到 00:05 将是 0,00:05 到 00:10 将是 1,依此类推。

我的数据框中有大约 1500 万行数据。作为处理这些数据的一部分,我将这两列转换为 R 的 DatePOSIXct 格式。我正在使用dplyr - 但是,我的代码花费的时间太长(大约 30 分钟)。下面我正在生成一个玩具数据集并提供我正在使用的代码:

library(dplyr)
DATA <- data.frame(DATE = rep(10082013,15000000), EPOCH = rep(6,15000000))

这是数据的示例视图

DATA %>% 
  head()

     DATE EPOCH
1 10082013     6
2 10082013     6
3 10082013     6
4 10082013     6
5 10082013     6
6 10082013     6

这是我将数据转换为我想要的格式的部分:

DATA %>%
  mutate(DATE_FORMATTED = as.Date(as.character(DATE), "%m%d%Y")) %>%
  mutate(DOW = weekdays(DATE_FORMATTED)) %>%
  mutate(TIME_FORMATTED = strftime(as.POSIXct(((EPOCH+1)*5*60), origin=as.character(DATE_FORMATTED), tz="UTC"), format="%R", tz="UTC")) %>%
  head()

我觉得开销是由于TIME_FORMATTED 公式中的所有强制。有没有办法更快地达到最终结果?也许是 dplyr 优化的不同功能?

【问题讨论】:

  • 你为什么要在最后一个mutate 中强制DATE_FORMATTED 回到character?根据文档,origin 无论如何都会被强制转换为 Date
  • 是的 - 最后一个 mutate 语句中的原始字符强制转换确实是多余的。
  • 好的 - 我明白我为什么要使用它了。我对strptimestrftime 这两个函数感到困惑。前者需要强制,而后者不需要。但是,代码仍然很慢。 :(
  • 我们目前没有针对日期时间优化的 dplyr 函数,但它在我的雷达上
  • @hadley:有没有列出针对mutate优化的函数的文档?

标签: r performance datetime dplyr large-data


【解决方案1】:

正如"Why is as.Date slow on a character vector?" 中所建议的,瓶颈可能是strptime。特别是,用户 daniel.s 的回答建议使用lubridate::fast_strptime

并且无需将DATE_FORMATTED 转换为character

请注意,我自己没有做过任何测试,所以也许会有更好的答案。

【讨论】:

    猜你喜欢
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2021-04-06
    • 1970-01-01
    • 2017-10-08
    • 1970-01-01
    相关资源
    最近更新 更多