2013-04-23 2 views
2

epoch 이후로 마이크로 초 값에서 POSIXlt 변수를로드해야합니다. 그것은 내가로드 기록의 수백만이 주어진 뒤얽힌 조금 보인다R에서 마이크로 초 정밀도 시계열을로드하는 방법은 무엇입니까?

options(digits.secs=6) 
mytime=1366039619645990 
as.POSIXlt(mytime %/% 1e6, tz="EST", origin="1970-01-01") + (mytime %% 1e6)/1e6 
[1] "2013-04-15 10:26:59.64598 EST" 

:이 작업을 수행하는 더 좋은 방법이 있나요.

+0

이것은 'mytime = 1366039619646000'과 같이 일부 반올림 오류가 발생하는 것으로 보입니까? –

+0

@ SimonO101 아마도 기본 값이 double로 구현되어있어 컴퓨터에서 다른 반올림을 할 수 있습니다. –

+0

이 0을 추가하는 요점은 정확히 무엇입니까? (mytime %% mytime)/1000000'? :) – eddi

답변

0

이는 모듈과 분열을 제거합니다 :

> mytime=1366039619645991 
> mytime.secs = mytime %/% 1e+6 
> mytime.usecs = mytime - as.integer(mytime.secs)*1e6 
> as.POSIXlt(mytime.secs, tz="", origin="1970-01-01") + mytime.usecs*1e-6+0.0000005 
[1] "2013-04-15 11:26:59.645991 EDT" 
+0

그리고 이것은 분명히 잘못된 값입니다. –

+0

@MatthewLundberg 덕분에 모든 예제에이 반올림 문제가있었습니다. 이제 해결되었습니다. –

2

모듈로 나누기가 시스템에서 발견 된 일부 반올림 오류를 생성 할 수 있습니다. 본질적으로 정말 어떠한 다른 것은 아니지만 시간의 작은 부분의 추가, 시간의 절반 최대 정확도는 ,이 문제를 해결해야 당신이 이미하고 있습니다 :

as.POSIXlt(mytime/1e6 , tz="EST", origin="1970-01-01") + 5e-7 
[1] "2013-04-15 10:26:59.64599 EST" 

대비 그와 :

mytime=1366039619646000 

# Produces rounding error 
as.POSIXlt(mytime/1000000, tz="EST", origin="1970-01-01") + (mytime %% mytime)/1000000 
[1] "2013-04-15 10:26:59.645 EST" 

as.POSIXlt(mytime/1e6 , tz="EST", origin="1970-01-01") + 5e-7 
[1] "2013-04-15 10:26:59.646 EST" 

그리고

mytime=1366039619645991 
as.POSIXlt(mytime/1000000, tz="EST", origin="1970-01-01") + 5e-7 
[1] "2013-04-15 10:26:59.645991 EST" 
+0

이것은 ' 나를 위해 반올림 오류를 해결, 그냥 주위에 그들을 교대. 'mytime = 1366039619645991'이면'> as.POSIXlt (mytime/1000000, tz = "EST", origin = "1970-01-01") + 1e-6 [1] "2013 년 4 월 10 일 : 26 : 59.645992 EST " > as.POSIXlt (mytime/1000000, tz ="EST ", origin ="1970-01-01 ") [1]"2013-04-15 10 : 26 : 59.645991 EST " ' – eddi

+0

@eddi 추가 된 분수가 너무 큽니다. 가능한 한 작은 시간 증가와 같습니다. 이 증가분의 절반을 더하면 이것을 수정해야합니다. 나는 갱신했다. 이것도 올바른 결과를 제공합니까? –

+0

:) 올바른 표현을 쓰려고 몇 번 시도한 후에 트릭을하는 것처럼 보입니다. 그러나 이것이 작동하는 이유가 명확하지 않습니다. – eddi

관련 문제