2014-01-08 4 views
2

Я ввел свои данные вручную, и, чтобы сэкономить время, в мои времена не было никаких знаков препинания. Так, например, 8:32 я входил как 832. 3:34 вечера Я ввел как 1534. Я пытаюсь использовать пакет «chrono» (http://cran.r-project.org/web/packages/chron/chron.pdf) в R, чтобы преобразовать их в формат времени, но для хронографа требуется разделитель между часовыми и минутными значениями. Как я могу обойти это или использовать другой пакет для преобразования моих чисел во времени?преобразование чисел во времени

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

+0

Предполагая, что вы сохранили данные в текстовом файле, не было бы легче прочитать эти данные в сценарии, устранить проблему с разделителем и вывести массированные данные в новый текстовый файл, а затем продолжить работу с вашим бизнесом?Просто мои центы по предмету, поскольку у меня нет опыта работы с r и пакетом chrono. Приветствия. –

+0

будет 1:01 утра 101 или 11? –

+0

Связанные: http://stackoverflow.com/questions/20929100/how-can-you-insert-a-colon-every-two-characters/20929127#20929127 –

ответ

2

Вот sub решения, используя регулярное выражение:

set.seed(1); times <- paste0(sample(0:23,10), sample(0:59,10)) # ex. data 
sub("(\\d+)(\\d{2})", "\\1:\\2", times) # put in delimitter 
# [1] "6:12" "8:10" "12:39" "19:21" "4:43" "17:27" "18:38" "11:52" "10:19" "0:57" 
+1

Немного короче эквивалент: 'sub (" (\\ d {2}) $ ",": \\ 1 ", times)' – janos

+1

Еще короче: 'sub (" (..) $ ",": \\ 1 ", times)' –

+0

Мне нравится решение «sub». Для любого другого, кто пытается понять, что на самом деле означает этот код, это должно помочь: http://stat.ethz.ch/R-manual/R-patched/library/base/html/regex.html – filups21

2

Say

x <- c('834', '1534') 

Последние два символа представляют минуты, так что вы можете извлечь их, используя

mins <- substr(x, nchar(x)-1, nchar(x)) 

Кроме того, экстракт часов с

hour <- substr(x, 0, nchar(x)-2) 

Затем создать фиксированный вектор значения времени с

time <- paste0(hour, ':', mins) 

Я думаю, что вы вынуждены указать даты в пакете Паралипоменона, поэтому если предположить значение даты, вы можете Converto Chron с этим:

chron(dates.=rep('02/02/02', 2), 
     times.=paste0(hour, ':', mins, ':00'), 
     format=c(dates='m/d/y',times='h:m:s')) 
+0

Спасибо JAponte. Это отлично работает! – filups21

4

Я думаю, что вам не нужен пакет chron обязательно. Когда:

x <- c(834, 1534) 

Тогда:

time <- substr(as.POSIXct(sprintf("%04.0f", x), format='%H%M'), 12, 16) 
time 

[1] "08:34" "15:34" 

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

df$datetime <- as.POSIXct(paste(df$yymmdd, sprintf("%04.0f", df$x)), format='%Y%m%d %H%M%S') 
+1

Собственно, m также бывший пользователь cron, преобразованный в Postixct. Приверженность хрона на десятичные знаки для представления времени суток создала много проблем с ошибками округления. Представление POSIXct представляет собой целое число, которое гарантирует уникальность значений. – JAponte

1

Я думал, что я выбросить, не регулярки решения, которое использует lubridate. Это, вероятно, слишком много.

library(lubridate) 
library(stringr) 

time.orig <- c('834', '1534') 

# zero pad times before noon 
time.padded <- str_pad(time.orig, 4, pad="0") 

# parse using lubridate 
time.period <- hm(time.padded) 

# make it look like time 
time.pretty <- paste(hour(time.period), minute(time.period), sep=":") 

И вы в конечном итоге с

> time.pretty 
[1] "8:34" "15:34" 
1

Вот два решения, которые не используют регулярные выражения:

library(chron) 
x <- c(832, 1534, 101, 110) # test data 

# 1 
times(sprintf("%d:%02d:00", x %/% 100, x %% 100)) 

# 2 
times((x %/% 100 + x %% 100/60)/24) 

Либо дает следующие Паралипоменон "times" объект:

[1] 08:32:00 15:34:00 01:01:00 01:10:00 

ADDED второе решение.

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