R中不规则格式的解析时间

时间:2017-03-19 09:32:53

标签: r datetime time datetime-format

我有一段时间了,

  [1] "9.58"      "19.19"     "43.03"     "1:40.91"   "2:11.96"   "3:26.00"  
  [7] "3:43.13"   "4:44.79"   "7:20.67"   "12:37.35"  "26:17.53"  "26:44"    

其中一些只有小数秒。他们中的一些人有几分钟和几小时,并以“:”

分隔

我希望所有这些都在一个单位(几秒或几分钟或几小时)。我怎么能在R

中做到这一点

3 个答案:

答案 0 :(得分:3)

我总是非常不愿意手工解析日期和时间,我相信自己的代码远远少于构建专用工具的其他人的测试工作。

所以我会使用lubridate例如:

library(lubridate)

data <-
  c("9.58", "19.19", "43.03", "1:40.91", "2:11.96", "3:26.00", 
   "3:43.13", "4:44.79", "7:20.67", "12:37.35", "26:17.53", "26:44")

difftime(parse_date_time(data, orders = c("%H %M %OS", "%M %OS", "%OS")), 
         parse_date_time("0", orders = "%S"))

# Time differences in secs
#  [1]    9.580002   19.190002   43.029999  100.910004  131.959999
# [6]  206.000000  223.129997  284.790001  440.669998  757.349998
# [11] 1577.529999 1604.000000

lubridate提供了提供连续尝试的多种解析格式的有利可能性(c("%H:%M:%OS", "%M:%OS", "%OS"),同时请注意:分隔符可以省略,允许更强大的解析格式不正确的输入数据) 我的解决方案仍然有点“hacky”,因为我无法直接将其解析为difftime,而是POSIXct,因此我将它们与0进行比较,以输出difftime }秒。

答案 1 :(得分:1)

您可以在冒号分隔符str_split上使用:拆分字符串,并将其转换为秒。

have <- c("9.58","1:40.91","1:01:02.1")

have_split <- strsplit(have,":")   ## List of times split

convert <- function(x){
    x <- as.numeric(x)
    if(length(x) == 1){               ## Has only seconds
        x                           
    } else if(length(x) == 2){        ## Has seconds and minutes
        out <- x[1]*60+x[2]
    } else if(length(x) == 3){        ## Has seconds, minutes and hours
        out <- x[1]*60^2+x[2]*60+x[3]
    }
}

sapply(have_split,convert)
## [1]    9.58  100.91 3662.10

答案 2 :(得分:1)

使用sub

将格式转换为统一格式后的几种方法
data1 <- sub("^([^:]+:[^:]+)$", "00:\\1", sub("^([0-9]*\\.*[0-9]*)$", "00:00:\\1", data))

1)使用chron - 转换&#39; data1&#39;到times对象,强制转换为numeric并在一天内乘以秒,即86400

library(chron)
60*60*24*as.numeric(times(data1))
#[1]    9.58   19.19   43.03  100.91  131.96  206.00
#[7]  223.13  284.79  440.67  757.35 1577.53 1604.00

2)使用period_to_seconds中的lubridate - 转换为datetime对象,然后使用period_to_seconds

将其更改为秒
library(lubridate)
period_to_seconds(hms(data1))
#[1]    9.58   19.19   43.03  100.91  131.96  206.00
#[7]  223.13  284.79  440.67  757.35 1577.53 1604.00