2012-10-05 2 views
4

오전 9시 50 분에 시작하는 하루 중 데이터를 사용 중이며 20 분 간격으로 변환하여 첫 번째 기간은 09:50 - 10:09:59이고 두 번째 시간대는 10:10부터 10:29:59까지입니다. 그러나 xts 패키지의 to.minutes() 패키지는 시간대를 정하는 것으로 보이며 시간 막대는 09:59:59 및 10:19:59 등에 있습니다. ..ie 10 분 밖에 안 남았습니다 ... 정기적 인 요청이 아닐지도 모릅니다. 그러나 올바른 끝점을 갖도록이 작업을 수행하고 있습니다. 즉, 프리스트 타임 스탬프를 기반으로합니다.사용자 지정 끝점을 사용하여 분.

보너스 포인트는 ... 최종 타임 스탬프를 기준으로 할 방법이 있습니까? (즉, 그 타임 스탬프부터 거꾸로가는 기간 엔드 포인트를 generateing? 여기

가 밖으로 10 분 것에 대해 내 점의 그림입니다 (

x <- xts(rnorm(24*60*60), as.POSIXct(format(paste(Sys.Date(),'09:50')))-((24*60*60):1)) 
head(x) 
x1 <- to.minutes(x, 20) 
head(x1) 

) 내가 원하는 것과 내가 해결하는 방법을 생각할 수 이 분할, 상처, lapplys do.calls 및 rbinds .... 사용하여하지만 기본적으로 OHLC 개체를 다시 만드는 것입니다 ... 그리고 그것은 기존 솔루션과 비교하여 비효율적 일 수 있다고 생각 ...

+0

difftime을 사용하여 기간을 미성년자에게 양도 할 수 없으며이를 기반으로 기간을 정의 할 수 있습니까? 질문을 올바르게 이해하지 못했을 수도 있습니다. – user702846

+0

흠 ... 나는 당신이 말한 것을 이해했는지 확신 할 수 없다. 내가 한 일은 데이터의 주기성을 줄이는 것이지만 시간을 고집하지는 않는다. –

+0

여기를 확인, http : //stat.ethz.ch/R-manual/R-devel/library/base/html/difftime.html minuts의 매개 변수 중 하나. 안 그래? – user702846

답변

3

나는 (오후 5 시까 지 FX 데이터를 나눠서) 비슷한 도전을 최근에했다. . 중 작업을 켜짐,

offset <- 600 
index(x) <- index(x) - offset 
x1 <- to.minutes(x, 20) 
index(x1) <- index(x1) + offset 

(NB는이 x 손상 : 분할을 수행 한 후 10 분 앞으로 분할 데이터를 이동,

library(xts) 
set.seed(42) 
x <- xts(rnorm(24*60*60), as.POSIXct(format(paste(Sys.Date(),'09:50')))-((24*60*60):1)) 

이동이 10 분 뒤로 : 테스트 데이터로 시작 복사하거나 나중에 index(x) <- index(x) + offset하십시오). 당신의 마지막 틱은 이전 20 분 정도 경계에서 600 초였다 때문에

     x.Open x.High  x.Low x.Close 
2012-10-06 10:09:59 1.3709584 3.495304 -3.371739 0.4408241 
2012-10-06 10:29:59 -0.7465165 3.584659 -2.828475 0.5938161 
2012-10-06 10:49:59 1.3275046 3.174520 -3.199558 -0.6273660 
... 
2012-10-07 09:09:59 -0.83742490 3.103466 -3.251721 -1.093380 
2012-10-07 09:29:59 -0.48464537 3.228048 -3.113351 -1.572931 
2012-10-07 09:49:59 1.90503697 3.420940 -3.505207 2.832325 

600의 매직 넘버가 와서 : 같은 x1 보인다. 다음은 동적으로 계산하는 방법입니다

offset <- (as.integer(last(index(x))) %% 1200) + 1 

as.integer은 초 - 이후 1970 형태로 마지막 틱의 시간을 변환합니다. 타임 스탬프에 밀리 초가있는 경우 as.numeric을 사용하십시오. %%1200은 20 분 경계로 반 내림합니다.마지막으로 +1to.minutes시작이 인 막대가 아닌 XX : XX : 00을 처리하기 때문에 이전 막대의 이 아닌이 XX : XX : 00을 처리하기 때문입니다.

6

xts 설명서에서 더 두드러 질 수있는 유용한 트릭이 있습니다.

,451,515,

시작은 xts 목적이 불규칙 시리즈 감안할 때

R> set.seed(42) ## fix seed 
R> X <- xts(cumsum(rnorm(100))+100, order.by=Sys.time()+cumsum(runif(100))) 
R> head(X) 
           [,1] 
2012-10-05 06:42:20.299761 101.371 
2012-10-05 06:42:20.816872 100.806 
2012-10-05 06:42:21.668803 101.169 
2012-10-05 06:42:22.111599 101.802 
2012-10-05 06:42:22.269479 102.207 
2012-10-05 06:42:22.711804 102.100 

와 함께, 우리는 우리가 부과 정기적으로 서브 세트합니다. 여기서는 2 초 간격을 만듭니다. 다른 사람이 과 동일한 유형 인 경우을 색인으로 사용합니다 (여기에는 POSIXct).

R> ind <- seq(start(X) - as.numeric(start(X)-round(start(X))) + 1, 
+    end(X), by="2 secs") 
R> head(ind) 
[1] "2012-10-05 06:42:21 CDT" "2012-10-05 06:42:23 CDT" 
[3] "2012-10-05 06:42:25 CDT" "2012-10-05 06:42:27 CDT" 
[5] "2012-10-05 06:42:29 CDT" "2012-10-05 06:42:31 CDT" 
R> 
트릭은 이제 새로운 시간 그리드에 마지막으로 좋은 불규칙한 OBS를 호출하는 데에 na.locf() 전화, 불규칙 하나 정규 시리즈를 병합하는 것입니다

- 다음 시간 그리드에서 서브 세트 :

R> na.locf(merge(X, xts(,ind)))[ind] 
          X 
2012-10-05 06:42:21 100.8063 
2012-10-05 06:42:23 102.1004 
2012-10-05 06:42:25 105.4730 
2012-10-05 06:42:27 107.2635 
2012-10-05 06:42:29 104.9588 
2012-10-05 06:42:31 101.7505 
2012-10-05 06:42:33 104.6884 
2012-10-05 06:42:35 103.6441 
2012-10-05 06:42:37 101.6476 
2012-10-05 06:42:39 98.6246 
2012-10-05 06:42:41 97.9922 
2012-10-05 06:42:43 97.7545 
2012-10-05 06:42:45 101.0187 
2012-10-05 06:42:47 98.0331 
2012-10-05 06:42:49 100.7752 
2012-10-05 06:42:51 103.0702 
2012-10-05 06:42:53 102.6578 
2012-10-05 06:42:55 103.1342 
2012-10-05 06:42:57 103.4714 
2012-10-05 06:42:59 102.3683 
2012-10-05 06:43:01 105.0394 
2012-10-05 06:43:03 103.9775 
R> 

Voila.

관련 문제