2015-07-29 3 views
1

Я пытаюсь преобразовать дату и время в метку времени с миллисекундами в R с помощью data.table (у меня есть ~ 300M строк, поэтому скорость имеет значение! Поэтому, если у вас есть более быстрая опция чем strptime (например, векторная функция, в которой мне не нужен аргумент «by» в data.table), я был бы в восторге! :)).R Milliseconds in Strptime data.table

вопрос до сих пор является следующее:

library(data.table) 
options(digits.secs = 3) 
a <- data.table(day = "20150727", time = "11:10:05.016") 

a[, mtime := strptime(paste(day, time), "%Y%m%d %H:%M:%OS", tz = "GMT"), 
    by = 1:nrow(a)] 
a 
#> a 
# day  time  mtime 
#1: 20150727 11:10:05.016 5.016 

Вопрос заключается в том, что время изменения, безусловно, не так ... Я хочу, чтобы получить всю метку времени, а не только секунды. Когда я делаю это вручную он работает отлично:

strptime(paste("20150727", "11:10:05.016"), "%Y%m%d %H:%M:%OS", tz = "GMT") 
# [1] "2015-07-27 11:10:05.016 GMT" 

Любые идеи? Спасибо!

+1

Вы не выполняете операции группировки здесь, поэтому, если скорость имеет значение, вам обязательно нужно избавиться от 'by = 1: nrow (a)' –

+0

Хорошая точка! Без аргумента я получил ошибку: _ [...] Поставляется 9 элементов, которые будут назначены 1000 элементам столбца 'str' (возвращенный остаток из 1 предмета) _. Однако, по аргументу, я не получил никаких ошибок, кроме неправильных значений, поэтому думал, что мне это нужно! – David

+0

Это не ошибка, это предупреждение. Это происходит потому, что 'POSIXlt' имеет много атрибутов. Это не произойдет с классом 'POSIXct' –

ответ

4

Я испытал ту же проблему, которую вы описываете. Однако, когда я использую as.POSIXct, проблем нет. Можете ли вы попробовать себя и посмотреть, работает ли это?

Я попытался следующие:

a[, posixct:=as.POSIXct(paste(day, time),format="%Y%m%d %H:%M:%OS", tz = "GMT")] 

    day   time mtime     posixct 
1: 20150727 11:10:05.016 5.016 2015-07-27 11:10:05.016 

Update

После замечания как Давидс, я провел некоторое время, исследуя fasttime пакет. Действительно, он намного быстрее, чем as.POSIXct, однако он поставляется с небольшим требованием, то есть формат даты должен быть стандартным ГГГГ-ММ-ДД. Ниже приведен код для воссоздания таблицы и некоторых сравнений времени.

# assuming that day is 2015-07-27 
a[, fastposixct:=fastPOSIXct(paste(day, time),required.components = 6L, tz = "GMT")] 
 
Unit: microseconds 
expr   min lq  mean median  uq  max neval 
as.POSIXct 61.579 62.64 69.59851 63.349 65.4725 240.298 100 

Unit: microseconds 
expr   min  lq  mean median  uq  max neval 
fastPOSIXct 26.897 27.959 33.96092 28.666 30.6135 135.544 100 

Надеется, что это помогает.

+0

Это выглядит неплохо! Тем не менее, мне кажется, что это решение довольно медленно ... – David

+0

Посмотрите на пакет [fasstime] (https://github.com/s-u/fasttime) –