R将数字转换为时间

R convert number into time

Excel有人给了我非常糟糕的数据,其中日期(如2015年7月1日)是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...

如果 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)

你也可以试试这个来获得指定的时间,但是你也必须去掉日期。

> 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"

或者比上面的更简单,使用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))