2014-09-04 3 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" 

업데이트 :

은 현재 내가이 솔루션을 찾았지만, 내가 하나 더 우아한이 희망 : 문제는 class(t) "는 점이다

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

답변

13

hms으로 변환해야하고 초기 문자열 형식으로 되돌아 가야하는 이유가 확실하지 않습니다.

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" 

편집 :

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" 

벤치 마크 출력

:
우리는 paste 사용할 수

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

+0

나는 (paranoically) 텍스트 파일에 쓸 때 각 항목에 대한 몇 바이트를 저장하는 문자열 형식을 고려하십시오. 그러나 당신의 솔루션은 제가 성취하려고하는 것을하지 않습니다. 이 줄은'닭고기 달걀'문제입니다 : POSIXct_myTime <- parse_date_time (myTime, "hms")'. myTime은 문자열 형식이 아닙니다. 나는 수백만 개의 항목을'% H : % M : % S' 형식으로 읽고 그것들을 필터링하고 입력과 정확히 같은 형식으로 다시 쓰려고합니다. – biocyberman

+0

"... 문자열 형식은 텍스트 파일에 쓸 때 각 항목의 일부 바이트를 저장합니다 ..."- 이것이 사실인지 확실하지 않습니다 ... 또한 "... myTime은 문자열 형식이 아닙니다. . "- 게시물에서 문자열을 hms로 전달합니다. - hms ("14:11:49 ") ' – zx8754

2

기간 "이고 format.Period() 함수에는 format=에 대한 매개 변수가 없습니다. t 개체는 format()과 함께 사용하는 데 사용할 수있는 표준 POSIXt 스타일 개체가 아닙니다. format.POSIXct()format.POSIXlt() 기능 만이 이와 유사하게 작동합니다.

아마도 가장 쉬운 방법은 Period 클래스를 POSIXct으로 바꾸는 도우미 함수를 정의하는 것입니다.

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

그것은 POSIXct는 날짜/시간 값뿐만 아니라 시간 값이므로주의하는 것이 중요합니다 : 우리는 함께 그렇게 할 수 있습니다. 그래서 기본적으로 우리는 오늘 그것이 자정에 시작되었다고 가정합니다. 그러나 "우리는 내가 내가 명백한 기능을 간과 한 때문에 아마 전문가 lubridate 사용자 아니에요 인정합니다 당신이

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

를 원하는 방식으로 형식을 사용할 수 있지만, 그것은으로 lubridate 클래스 포맷에 대한 옵션을 보인다 예쁜 "형식은 매우 제한적입니다.

+0

이 솔루션은 작동하지만, 필요 어쩌면 parse_date_time 기능은 당신이 필요하다 시간을 dat로 변환하는 추가 단계 e_time 객체. 어쨌든'format.POSIXct()'와'format.POSIXlt()'함수를 언급 해 주셔서 감사합니다. – biocyberman

+1

글쎄, 당신의 원래 질문은 당신이 왜 그것이 작동하지 않는지를 알지 못했을 뿐이었다. 그것은 어떤 것에 대해서도 "해결책"을 요구하지 않았다. 그것이 실제 질문이 아니라면, 나는 미래에 당신의 질문에 대해 더 나은 말을하려고 노력할 것입니다. '% H : % M : % S "구문과 함께'format' 함수를 사용하기를 정말로 원했기 때문에 나는 변환만을했습니다. – MrFlick

관련 문제