R преобразовать число во время

Кто-то дал мне действительно плохие данные в Excel, где дата (например, 1 июля 2015 г.) - 20150701, а время (например, 11:41:23) - 114123. Имеется более 50 000 строк данных, и мне нужно их преобразовать. все в соответствующие объекты даты и времени. Это не количество секунд от какой-либо эпохи, это просто дата или время без тире или двоеточия.

Я импортировал их во фрейм данных и преобразовал даты с помощью функции ymd (), но я не могу найти функцию для этого на время, hms () выдает мне ошибку:

package(lubridate)
df <- readWorksheetFromFile(file="cktime2012.xls", sheet=1)
df$date <- ymd(df$date)
df$time <- hms(df$time)
# Warning message:
#  In .parse_hms(..., order = "HM", quiet = quiet) :
#   Some strings failed to parse

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

DATEIN      TIMEIN  etc...
2012-02-01  200000  etc...
etc...

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

DATEIN      TIMEIN      etc...
2012-02-01  20:00:00    etc...
etc...

person Zachary Weixelbaum    schedule 01.07.2015    source источник
comment
Если вы на самом деле пытаетесь собрать дату и время в одном столбце в формате POSIXct, вам следует вставить вместе DATEIN и TIMEIN и преобразовать в POSIXct (используя любой из ответов, чтобы получить правильное форматирование).   -  person eipi10    schedule 01.07.2015


Ответы (3)


Если TIMEIN всегда состоит из шести символов (т. Е. Перед 10 часами утра есть начальный ноль), вы можете сделать это:

df$TIMEIN = paste0(substr(df$TIMEIN,1,2),":",substr(df$TIMEIN,3,4),":", substr(df$TIMEIN,5,6))
df$TIMEIN = hms(df$TIMEIN)
person eipi10    schedule 01.07.2015
comment
когда я это делаю, первая строка превращает его в правильный формат XX: XX: XX, но когда я делаю вторую строку, все ячейки превращаются в нули - person Zachary Weixelbaum; 01.07.2015
comment
Будет легче понять, что может происходить, если вы опубликуете образцы данных, воспроизводящих проблему. - person eipi10; 01.07.2015
comment
Все, что у меня есть, это то, что вы видите в вопросе, но ваш ответ отлично работает, если вы запустите только первую строку кода. Затем я могу взять его и объединить с информацией DATEIN, и он даст мне правильный столбец даты и времени. - person Zachary Weixelbaum; 01.07.2015

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

> as.POSIXct("200000", format="%H%M%S")
[1] "2015-07-01 20:00:00 IST"

Изменить- Хорошо, as.POSIXct() работает с датой и временем. Итак, чтобы объединить все в одно, вы можете сделать что-то вроде этого.

> as.POSIXct("20120201 200000", format="%Y%m%d %H%M%S")
[1] "2012-02-01 20:00:00 IST"
person TrigonaMinima    schedule 01.07.2015
comment
@Frank Есть ли способ объединить время с датой из другой строки вместо сегодняшней даты? Это могло бы спасти меня от следующего шага, который мне нужно было сделать. - person Zachary Weixelbaum; 01.07.2015
comment
Примерно так: ymd_hms(paste(df$DATEIN, gsub("(..)", "\\1 ",df$TIMEIN)) используя ответ в комментарии Фрэнка. - person eipi10; 01.07.2015

Или проще, чем приведенные выше, используя трубы в tidyverse, вы можете получить следующее:

# make sure you have dates stores as POSIXct 
# call in tidyverse library to make use of pipes and use the code bellow

df_hms <- df %>%
  mutate(time = hms::as.hms(TIMEIN))
person GaB    schedule 20.09.2018