2014-09-04 21 views
10

Neden çalışmadığını bilmiyorum. İşte benim kodudur:lubridate, tarih saatini biçimlendirilmiş bir zaman dizgesine dönüştür

> 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" 

Güncelleme:

Şu anda bu çözüm bulduk ama bir daha şık olduğunu umut: Sorun class(t) "olmasıdır

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

cevap

13

Neden hms ve başlangıç ​​dizesi biçimine dönüştürmeniz gerektiğini bildiğinizden emin olun.

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" 

DÜZENLEME:

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" 

Benchmark çıktı

:
Biz paste kullanabilirsiniz

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

Bu daha iyi bir fikir gibi görünüyor. – MrFlick

+0

Metin dosyasına yazarken her giriş için bazı baytları kaydeden dize formatını (paranoically) düşünün. Ancak çözümünüz, elde etmeye çalıştığım şeyi yapmıyor. Bu çizgi 'chicken-egg' problemi:' POSIXct_myTime <- parse_date_time (myTime, "hms") '. Saatim dize biçiminde yok. % H:% M:% S' biçiminde milyonlarca girdi okuyorum, bunları filtreleyin ve giriş ile aynı biçimi geri yazmak istiyorum. – biocyberman

+0

"... dize biçimi, metin dosyasına yazarken her giriş için bazı baytları kaydeder ..." - bunun doğru olmadığından emin değilim ... Ayrıca, "... Zamanım dize biçimimde de değil .. "- Senin yazı içinde bir dize hms geçiriyorsun - hms (" 14:11:49 ")' – zx8754

2

Dönem "ve format.Period() işlevinin format= için bir parametresi yoktur. t nesnesi, format() ile birlikte kullanabileceğiniz standart bir POSIXt stil nesnesi değildir. Sadece format.POSIXct() ve format.POSIXlt() işlevleri böyle davranacaktır.

Belki de yapılacak en kolay şey, Period sınıfını POSIXct'a dönüştürmek için yardımcı işlev tanımlamak olabilir.

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

O POSIXct bir tarih/saat değeri, sadece bir zaman değeridir olduğuna dikkat etmek önemlidir: Biz ile yapabilirsiniz. Yani varsayılan olarak, bugün gece yarısında başladığını varsayıyoruz. Ama sonra "Biz ben bariz işlevi gözardı ettik yüzden belki bir uzman lubridate kullanıcı değilim itiraf etmeliyim sen

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

istediği şekilde biçimini kullanabilirsiniz, ancak içine lubridate sınıfları biçimlendirme seçeneklerini görünüyor oldukça "formatlar çok sınırlıdır.

+0

Bu çözüm çalışır ancak gerektirir Belki parse_date_time işlevi ne ihtiyaç vardır zamanı dat'a dönüştürmek için ekstra bir adım e_time nesnesi. Her neyse, format.POSIXct() 've' format.POSIXlt() 'işlevlerinden bahsetmeye teşekkürler. – biocyberman

+1

Asıl sorunun sadece neden işe yaramadığını bilmiyordu, hiçbir şey için "çözüm" istemiyordu. Bu senin asıl sorunun olmasaydı, gelecekte sorularınızı daha iyi ifade etmeye çalışırdım. Dönüştürmeyi yaptım çünkü 'format' fonksiyonunu' '% H:% M:% S '' sözdizimi ile kullanmak isteyebilirsiniz. – MrFlick