2011-08-31 3 views
7

저는 데이터베이스에서 데이터를 추출하고 rehsape2를 통해 결과를 실행하고 있습니다. 어떤 이유로 POSIXct datetime 스탬프를 숫자로 변환합니다. 문제 없음 나는 생각한다, 당신은 단지 시간을 제외하고, 그들을 되돌릴 수있다.POSIXct에서 날짜 시간을 변환하면 결과가 엉망이됩니까?

여기에 최소한의 예를 분명히

foo<-as.POSIXct("2011-04-04 14:18:58") 
as.numeric(foo)  #gives 130192318 
bar<-as.POSIXct(as.numeric(foo), 
       tz=Sys.timezone(), 
       origin=as.POSIXct(
        strptime("1970-01-01 00:00:00", "%Y-%m-%d %H:%M:%S", tz="UTC"))) 
as.numeric(bar)  #gives 130192318 identical ! 
foo  #Gives "2011-04-04 14:18:58 BST" 
bar  #Gives "2011-04-04 13:18:58 UTC" 

foo는 바는 수치 적으로 동일하지만 R은 foo는이 UTC로 BST와 막대로 표시 할 필요가있다 생각합니다. 두 가지를 모두 BST로 표시하려면 어떻게합니까? 이것도 작동하지 않습니다.

as.POSIXct(bar, tz="BST") #still gives "2011-04-04 13:18:58 UTC" 

답변

13

다음은 무슨 일입니까? bar는 다음과 같이 정의된다 as.POSIXct.numeric를 사용하여 작성됩니다

as.POSIXct.numeric 
function (x, tz = "", origin, ...) 
{ 
    if (missing(origin)) 
     stop("'origin' must be supplied") 
    as.POSIXct(origin, tz = tz, ...) + x 
} 
<environment: namespace:base> 

당신은 POSIXct 객체 인 근원을 제공합니다. 즉 같이 정의된다 as.POSIXct.default- as.POSIXct.numeric 파견의 as.POSIXct 전화, 의미

as.POSIXct.default 
function (x, tz = "", ...) 
{ 
    if (inherits(x, "POSIXct")) 
     return(x) 
    if (is.character(x) || is.factor(x)) 
     return(as.POSIXct(as.POSIXlt(x, tz, ...), tz, ...)) 
    if (is.logical(x) && all(is.na(x))) 
     return(.POSIXct(as.numeric(x))) 
    stop(gettextf("do not know how to convert '%s' to class \"POSIXct\"", 
     deparse(substitute(x)))) 
} 
<environment: namespace:base> 

xPOSIXct 클래스 객체 (origin 당신은 당신의 초기 호출에 제공)입니다, 그래서 단순히 반환되고 tz= 인수입니다 무시.


는 UPDATE :
다음은 적절한 시간대에 POSIXct 다시 foo을 변환 할 수있는 방법입니다.

(foo <- as.POSIXct("2011-04-04 14:18:58", tz="GB")) 
# [1] "2011-04-04 14:18:58 BST" 
.POSIXct(as.numeric(foo), tz="GB") 
# [1] "2011-04-04 14:18:58 BST" 
+1

+1 무슨 일이 있는지 보여주기 위해 – Andrie

+1

Brilliant. 업데이트를 추가해 주셔서 감사합니다. – PaulHurleyuk

2

다음은이 문제를 해결하기 위해 사용했던 실수입니다. 현재 시간에서 현재 시간의 숫자 버전을 뺀 값으로 원점을 지정하면 시간대가 엉망이되는 것 같지 않습니다.

foo<-as.POSIXct("2011-04-04 14:18:58") 
as.numeric(foo)  #gives 130192318 
bar<-as.POSIXct(as.numeric(foo), tz="GB", origin=Sys.time()-as.numeric(Sys.time())) 
as.numeric(bar)  #gives 130192318 identical ! 
foo  #Gives "2011-04-04 14:18:58 BST" 
[1] "2011-04-04 14:18:58 BST" 
bar  #Gives "2011-04-04 14:18:58 BST" 
[1] "2011-04-04 14:18:58 BST 
+0

나는 당신이 원하는 것을 오해했습니다. 난 당신이 덜 cludgey 찾을 수있는 솔루션으로 내 대답을 업데이 트했습니다. –

관련 문제