2017-09-13 75 views
1

我有一個指定一天中的小時的雙精度矢量,例如下面給出的示例。 6.50將對應於06:30hh:mm格式等。在R中將十進制數字double轉換爲小時,時間或difftime

ts <- c(6.50, 7.00, 7.25, 7.45, 8.00) 

我想將其轉換爲日期或時間格式。我能想出的解決方案涉及從數字中除去小數位並將其轉換爲分鐘,但是這感覺有點「黑客」,例如,

library(lubridate) 
hm(paste(floor(ts), (ts - floor(ts)) * 60, sep = ':')) 

當然有更好的方法來做到這一點?

回答

2

試試這個:

library(chron) 

times(ts/24) 
## [1] 06:30:00 07:00:00 07:15:00 07:27:00 08:00:00 

這也將工作:

library(chron) 
library(lubridate) 

hms(times(ts/24)) 
## [1] "6H 30M 0S" "7H 0M 0S" "7H 15M 0S" "7H 27M 0S" "8H 0M 0S" 
+0

這個效果很好,謝謝! 驚訝這不是更簡單與lubridate – JanLauGe

0
> lubridate::hm(ts) 
[1] "6H 50M 0S" "7H 0M 0S" "7H 25M 0S" "7H 45M 0S" "8H 0M 0S" 

替代請求(你已經在你的問題):

> paste(floor(ts), round((ts-floor(ts))*60), sep=":") 
[1] "6:30" "7:0" "7:15" "7:27" "8:0" 
+0

謝謝您的回答。 請注意,按照預期,「6.5」轉換爲「6H 50M 0S」而不是「6H 30M 0S」。所以,不幸的是,這不是我正在尋找的。 – JanLauGe

+0

那麼,在這種情況下,其他元素會相應更新。 – Sagar

1

堅持只與lubridate

library(lubridate) 
as.period(as.duration(days(x=1))*(ts/24)) 
# "6H 30M 0S" "7H 0M 0S" "7H 15M 0S" "7H 27M 0S" "8H 0M 0S" 
+0

謝謝你提供lubridate方法!我遇到了以下錯誤:'as.duration(days(x = 1))中的錯誤:as.duration沒有爲'ordered'類定義.duration沒有爲class'factor''定義? – JanLauGe

+1

如果你跑步,你會得到什麼? (days(x = 1))'output ='[1]「86400s(〜1 days)''days(x = 1)'output ='[1]」1d 0H 0M 0S「'''' – CPak

+0

啊,我們走吧!命名空間與'chron'衝突。這工作:'as.period(as.duration(lubridate :: days(x = 1))*(ts/24))''。再次感謝:) – JanLauGe

相關問題