首页 文章

R将数字转换为时间

提问于
浏览
4

有人在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...

3 回答

  • 4

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

    你也可以尝试这个来获得指定的时间,但是你也必须摆脱日期 .

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

    Edit- 好的, as.POSIXct() 适用于日期和时间 . 因此,要将整体合并为一个,您可以执行类似的操作 .

    > as.POSIXct("20120201 200000", format="%Y%m%d %H%M%S")
    [1] "2012-02-01 20:00:00 IST"
    
  • 0

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

相关问题