2015-12-11 3 views
3

У меня есть значения в формате «221559460», где первые два - час, остальные два - минуты, а следующие цифры - в миллисекундах. Есть ли какой-либо метод быстрого доступа для преобразования в формат временных рядов без добавления вручную «:» в значение и вычисления второго из миллисекундных цифр в R?Преобразование значения в формат времени в R

+0

что именно ваш ожидаемый выход – Bg1850

+0

«22: 15: 59.460» - ожидаемый результат, а R идентифицирует его как время. – Anish

ответ

3

Я думаю, что вы не можете избежать некоторых синтаксический здесь из-за не имея «секунд» часть, но это можно сделать довольно легко, даже с простым регулярным выражением:

> sub(pattern  = '([0-9]{2})([0-9]{2})([0-9]{2})([0-9]*)', 
+  replacement = '\\1:\\2:\\3.\\4', 
+  x   = 221559460) 
[1] "22:15:59.460" 

> strptime(
+  x = sub(pattern  = '([0-9]{2})([0-9]{2})([0-9]{2})([0-9]*)', 
+    replacement = '\\1:\\2:\\3.\\4', 
+    x   = 221559460), 
+  format = '%H:%M:%OS') 
[1] "2015-12-11 22:15:59 PST" 

Обновленный ответ, основанный на комментарий ниже:

> options(digits.secs = 3) 
> strptime(
+  x = sub(pattern  = '([0-9]{8})_([0-9]{2})([0-9]{2})([0-9]{2})([0-9]*)', 
+    replacement = '\\1 \\2:\\3:\\4.\\5', 
+    x   = '20150819_221559460'), 
+  format = '%Y%m%d %H:%M:%OS') 
[1] "2015-08-19 22:15:59.46 PDT" 

Обновление для векторизованного Например:

> df <- data.frame(timestamp = paste('20150819', 221559460 + round(runif(10) * 100), sep = '_')) 
> strptime(sub('([0-9]{3})$', '.\\1', df$timestamp),'%Y%m%d_%H%M%OS') 
[1] "2015-08-19 22:15:59.517 PDT" "2015-08-19 22:15:59.550 PDT" 
[3] "2015-08-19 22:15:59.538 PDT" "2015-08-19 22:15:59.493 PDT" 
[5] "2015-08-19 22:15:59.484 PDT" "2015-08-19 22:15:59.549 PDT" 
[7] "2015-08-19 22:15:59.510 PDT" "2015-08-19 22:15:59.462 PDT" 
[9] "2015-08-19 22:15:59.466 PDT" "2015-08-19 22:15:59.474 PDT" 
+0

Мое фактическое значение было «20150819_221559460», где первая часть в yy-mm-dd, которую я удалил, чтобы упростить. Как вы видите дату на выходе, могу ли я использовать исходное значение данных? – Anish

+1

@ daroczig Просто вызов 'strptime (" 221559460 ", format ="% H% M% S ")' также дает тот же результат. OP также нуждается в дробной части секунды. Вероятно, 'options (digits.secs = 3)' может помочь. –

+0

@ daroczig нам не хватает значения в миллисекундах. – Anish

Смежные вопросы