簡體   English   中英

R中將HH:MM:SS轉換為小時(超過24小時)

[英]Convert HH:MM:SS to hours (for more than 24 hours) in R

我想在R里轉換超過24小時的小時數。

例如,我有一個包含小時和分鍾的數據框,如[HH:MM]:

[1]“111:15”“221:15”“111:15”“221:15”“42:05”

我希望它們能在幾個小時內轉換成這樣:

“111.25”“221.25”“111.25”“221.25”“42.08333333”

as.POSIXct() 

功能適用於一般用途,但不能超過24小時。

你可以用分割字符串strsplit和使用sapply轉換所有值。

vec <- c("111:15", "221:15", "111:15", "221:15", "42:05")

sapply(strsplit(vec, ":"), function(x) {
  x <- as.numeric(x)
  x[1] + x[2] / 60
})

結果:

[1] 111.25000 221.25000 111.25000 221.25000  42.08333

我只想用正則表達式解析字符串。 抓住之前的位:然后加上后面的位:除以60

> foo = c("111:15", "221:15", "111:15", "221:15", "42:05")
> foo
[1] "111:15" "221:15" "111:15" "221:15" "42:05" 
> as.numeric(gsub("([^:]+).*", "\\1", foo)) + as.numeric(gsub(".*:([0-9]{2})$", "\\1", foo))/60
[1] 111.25000 221.25000 111.25000 221.25000  42.08333

另一種可能性是矢量化函數,例如:

FUN <- function(time){
    hours <- sapply(time,FUN=function(x) as.numeric(strsplit(x,split=":")[[1]][1]))
    minutes <- sapply(time,FUN=function(x) as.numeric(strsplit(x,split=":")[[1]][2]))
    result <- hours+(minutes/60)
    return(as.numeric(result))
}

使用strsplit提取小時和分鍾的地方,然后將分數除以60后得到總和。

然后你可以使用這樣的函數:

FUN(c("111:15","221:15","111:15","221:15","42:05"))

[1] 111.25000 221.25000 111.25000 221.25000  42.08333

strapplyc這里是一個在gsubfn包中使用strapplyc的解決方案。 它將匹配傳遞給每個帶括號的正則表達式(即小時和分鍾)到第三個參數中描述的函數。 該函數可以使用通常的R函數表示法指定,它還支持使用公式(此處使用)的簡短形式,其中公式的右側是函數體,左側表示參數,默認為自由右側的變量( mh )。 我們假設原始字符向量是ch

library(gsubfn)
strapply(ch, "(\\d+):(\\d+)", ~ as.numeric(h) + as.numeric(m)/60, simplify = TRUE)

數字處理另一種方法是用a替換: 並以數字方式操縱它到我們想要的東西:

num <- as.numeric(chartr(":", ".", ch))
trunc(num) + 100 * (num %% 1) / 60

sub這是另一種方法:

h <- as.numeric(sub(":.*", "", ch))
m <- as.numeric(sub(".*:", "", ch))
h + m / 60

上面的代碼給出了一個數字結果,但是如果需要字符結果,我們可以將每個代碼包裝在as.character(...)中。

函數read.table

as.matrix(read.table(text = ch, sep = ":")) %*% c(1, 1/60)

評估/解析 這一個將每一個操作成一個R表達式,並對其進行評估。 這個很短,但使用eval經常不贊成:

sapply(parse(text = sub(":", "+(1/60)*", ch)), eval)

增加了額外的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM