2014-09-12 4 views
2

Этот вопрос касается производительности кода. У меня есть фрейм данных с двумя столбцами:Эффективное форматирование даты и времени в больших наборах данных в исполнении R - dplyr

  • DATE представлена ​​как числовая в MMDDYYYY формате
  • EPOCH является представлением времени с шагом 5 минут от полуночи. EPOCH отсчет начинается с 0 - так 00:00 до 00:05 будет 0, 00:05 до 00:10 будет 1 и так далее.

У меня около 15 миллионов строк данных в моем кадре данных. В рамках обработки этих данных я преобразую два столбца в формат R Date и POSIXct. Я использую 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

Почему вы вынуждаете 'DATE_FORMATTED' возвращаться к' символу' в последнем 'mutate'? Согласно документам, 'origin' в любом случае принуждается к' Date'. – shadowtalker

+0

Да - характер принуждения происхождения в последнем заявлении мутанта действительно был избыточным. – sriramn

+0

Хорошо. Я понимаю, почему я это использовал. Я запутался между двумя функциями 'strptime' и' strftime'. Первый требует принуждения, а второй - нет. Однако код все еще медленный. :( – sriramn

ответ

1

Как указано в "Why is as.Date slow on a character vector?", узким местом, вероятно, является strptime. В частности, ответ пользователя daniel.s предлагает использовать lubridate::fast_strptime.

И нет необходимости конвертировать DATE_FORMATTED в character.

Имейте в виду, я не проводил никаких испытаний самостоятельно, поэтому, возможно, лучший ответ придет.