2014-09-12 34 views
2

此问题是关于代码性能的。我有两列的数据帧:在R-dplyr性能的大数据集中有效地格式化日期和时间

  • DATE被表示为数字在MMDDYYYY
  • 格式
  • 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优化了不同的功能?

+0

为什么在最后的'mutate'中强制'DATE_FORMATTED'回到'character'?根据文档,无论如何,'origin'都被强制转换为Date。 – shadowtalker 2014-09-12 23:07:42

+0

是的 - 最后的变异陈述中的原始字符强制确实是多余的。 – sriramn 2014-09-12 23:23:01

+0

好的 - 我明白了我为什么使用它。我在两个函数'strptime'和'strftime'之间混淆了。前者要求强制,后者则不要。但是,代码仍然很慢。 :( – sriramn 2014-09-12 23:28:29

回答

1

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

而且没有必要将DATE_FORMATTED转换为character

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