2014-09-04 116 views
10

我不知道它爲什麼不起作用。這裏是我的代碼:lubridate,將日期時間轉換爲格式化的時間字符串

> t <- hms("14:11:49") 
> t 
[1] "14H 11M 49S" 
t <- t + minutes(3) 
> format(t, format="%H:%M:%S") 
[1] "14H 14M 49S" 
# Expected output: "14:14:49" 

更新:

目前我發現這個解決辦法,但我希望有一個更優雅的一個:

t <- hms("14:11:49") # example period object 
sprintf("%s:%s:%s", hour(t), minute(t), second(t)) 
#"14:11:49" 

回答

13

不知道爲什麼你需要轉換爲hms並返回到初始字符串格式。也許parse_date_time功能是你所需要的:

library(lubridate) 
myTime <- "14:11:49" 
hms(myTime) 
#"14H 11M 49S" 

POSIXct_myTime <- parse_date_time(myTime,"hms") 
format(POSIXct_myTime, format="%H:%M:%S") 
#"14:11:49" 

編輯: 我們可以用paste

t <- hms("14:11:49") 
t 
#[1] "14H 11M 49S" 
t <- t + minutes(3) 
t 
#[1] "14H 14M 49S" 

paste(hour(t),minute(t),second(t),sep=":") 
#[1] "14:14:49" 

基準輸出:

op <- microbenchmark(
    Use_paste=paste(hour(t),minute(t),second(t),sep=":"), 
    Use_sprintf=sprintf("%s:%s:%s", hour(t), minute(t), second(t)), 
    times=1000000L) 
op 

# Unit: microseconds 
# expr min  lq median  uq  max neval 
# Use_paste 28.072 31.695 32.601 33.506 44253.42 1e+06 
# Use_sprintf 29.582 33.807 34.412 35.619 44367.52 1e+0 
+1

這似乎是一個更好的主意。 – MrFlick 2014-09-04 14:53:46

+0

我認爲(偏執)字符串格式時,寫入文本文件時爲每個條目保存一些字節。然而你的解決方案並沒有達到我想要達到的效果。這一行是'egg-egg'問題:'POSIXct_myTime < - parse_date_time(myTime,「hms」)'。我沒有字符串格式的myTime。我讀了數以百萬計的'%H:%M:%S'格式的條目,對它們進行過濾並希望寫回與輸入完全相同的格式。 – biocyberman 2014-09-05 08:47:58

+0

「...字符串格式在寫入文本文件時爲每個條目保存一些字節...」 - 不確定這是否爲真...另外,「...我沒有字符串格式的myTime .. 。「 - 在你的文章中你傳遞一個字符串給hms - 'hms(」14:11:49「)' – zx8754 2014-09-05 09:29:15

2

的問題是,class(t)是「期間「,format.Period()函數沒有format=的參數。 t對象不是標準的POSIXt樣式對象,您可能會習慣於使用format()。只有format.POSIXct()format.POSIXlt()函數的行爲將如此。

所以也許最簡單的做法是定義一個輔助函數將Period類變爲POSIXct。我們可以做到這一點:

as.POSIXct.Period <- function(x, start=today()) { 
    X<-as.interval(x, start); 
    [email protected][email protected] 
} 

需要注意的是POSIXct是一個日期/時間值,不只是一個時間值是非常重要的。所以默認情況下,我們假設它在今天午夜開始。但是,我們可以使用格式你想

format(as.POSIXct(t), format="%H:%M:%S") 
# [1] "14:11:49" 

的方式,我必須承認,我不是專家lubridate用戶所以也許我忽略了一個顯而易見的功能,但它似乎選項用於格式化lubridate類分爲「漂亮「的格式非常有限。

+0

此解決方案,但需要將時間轉換爲數據的額外步驟e_time對象。無論如何,感謝提及'format.POSIXct()'和'format.POSIXlt()'函數。 – biocyberman 2014-09-05 13:25:41

+1

那麼,你原來的問題只是你不知道爲什麼它不起作用,它並不是要求任何東西的「解決方案」。如果這不是你真正的問題,那麼我會盡力在未來提出你的問題。我只進行了轉換,因爲您似乎確實希望使用格式函數和'「%H:%M:%S」'語法。 – MrFlick 2014-09-05 13:30:07

相關問題