R 및 kdb+에서 Datetime/POSIXct 동작 정정

R-Blogger · 블로그·해설 · 2009-02-17

R-Blogger블로그·해설한국어2009-02-17

R 및 kdb+에서 Datetime/POSIXct 동작 정정

R와 kdb+의 올바른 datetime / POSIXct 동작우리는 고성능 컬럼 스토어 백엔드로 kdb+를 검토하기 시작했습니다. Kx가 무료 평가판을 제공하므로 며칠 정도 시스템 전반, 데이터 로드·덤프, 그리고 특히 R 인터페이스를 사용해 보았습니다. 몇 개의 파일(인터페이스 코드를 포함한 C 소스 파일 하나, C 코드를 호출하는 R 파일 하나, 링크할 오브젝트 파일 하나, 헤더 파일 하나, 그리고 간단한 Makefile)만으로 몇 분 만에 CRAN 스타일의 R 패키지로 전환할 수 있었습니다.이번 글을 쓰게 된 이유는 R·kdb+ 접합 코드가 기본적으로는 잘 동작하지만, datetime 처리에서는 문제가 있었기 때문입니다. 날짜·시간 객체를 시스템 간에 숫자나 문자열처럼 그대로 전달할 수 있으면 좋겠다고 생각했으며(예: R과 C++를 연결하는 Rcpp 패키지를 참고), 밀리초 단위 타임스탬프가 매끄럽게 이동하지 않아 다소 불편했습니다.문제는 기본 변환 함수에 여러 결함이 있었기 때문입니다. 정수형으로 변환했고, 스칼라 하나만 처리했으며(벡터화되지 않음), 참조 카운트를 잘못 감소시켰습니다. 제가 생각하기에 더 나은 구현은 아래와 같습니다.static SEXP from_datetime_kobject(K x) { SEXP result; int i, length = x->n; if (scalar(x)) { result = PROTECT(allocVector(REALSXP, 1)); REAL(result)[0] = (kF(x)[0] + 10957) * 86400; } else { result = PROTECT(allocVector(REALSXP, length)); for(i = 0; i < length; i++) { REAL(result)[i] = (kF(x)[i] + 10957) * 86400; } } SEXP datetimeclass = PROTECT(allocVector(STRSXP,2)); SET_STRING_ELT(datetimeclass, 0, mkChar("POSIXt")); SET_STRING_ELT(datetimeclass, 1, mkChar("POSIXct")); setAttrib(result, R_ClassSymbol, datetimeclass); UNPROTECT(2); return result; }이 구현은 스칼라와 벡터 모두를 처리하며, kdb+의 “2000년 1월 1일 이후의 소수일” 형식을 Unix 기준인 “epoch(1970‑01‑01) 이후 초 단위”로 변환합니다. R에서 요구하는 소수 초도 포함하고, 클래스 속성을 POSIXt와 POSIXct로 설정합니다.이제 select max datetime from table과 같은 쿼리는 기대한 대로 동작하고, 거래나 견적 기록과 같은 타임스탬프 벡터도 R에 올바른 POSIXct 형태로 들어옵니다. 다만, TZ를 UTC로 설정해야 하며, 그렇지 않으면 원하지 않는 시간대 오프셋이 발생할 수 있습니다.
원문 URL
전체 글은 원문 페이지에서 이어서 읽을 수 있습니다.
원문에서 전체 글 읽기
작성자
R-Blogger
출처
R-Blogger
플랫폼
R-Blogger
분류
블로그·해설
언어
한국어
발행일
2009-02-17