2014-04-08 1 views
0

Python (pytables 사용)에서는 타임 스탬프가 포함 된 행 (열 데이터 유형 Time64, http://pytables.github.io/usersguide/datatypes.html 참조)이있는 HDF5 테이블을 쉽게 만들 수 있습니다.IDL에서 HDF5 Time64 컬럼을 읽으려면 어떻게해야합니까?

IDL 8.2에서 Time64 유형의 열을 포함하는 테이블을 읽을 수 있습니까?

fid = H5F_OPEN(filename) 
tabID = H5D_OPEN(fid, '/path/to/table') 
data = H5D_READ(tabID) 

의 기본 접근 방식은 노드 /path/to/table 유형의 Time64의 열을 포함하는 경우 질식 할 것 같다. IDL에 의해 네이티브로 지원되지 않더라도 IDL의 데이터 유형을 변환/해석하는 방법이 있다고 생각하십니까? 결국 Time64 열은 8 바이트 값입니다 ...

찾을 수있는 가장 관련성이 높은 IDL 문서는 http://www.exelisvis.com/docs/HDF5_Overview.html입니다.

측면 질문 : HDF5 그룹의 HDFView는 HDF5에 특수 8 바이트 열 유형이 있지만 Time64도 지원하지 않는 것 같습니다 (미안하지만 다른 링크를 게시 할 수 없음). pytables에서 사용하는이 열 유형이 표준 열 유형이 아닌가?


편집 : 나는 Time64 열이있는 테이블을 포함하는 예시 HDF5 파일을 만든, 링크에 대한 설명을 참조하십시오. 이 파일은 다음과 같은 파이썬 코드로 생성 :

import tables as T 
import time 

exampleTableColumns = { 
    'id': T.Int32Col(pos=0), 
    'value': T.Float32Col(pos=1), 
    'timestamp': T.Time64Col(pos=2), 
    } 
with T.openFile('time64-example.h5', 'w') as h5: 
    exampleTab = h5.createTable(
     '/', 'example', exampleTableColumns) 
    # Add some test values 
    t = time.time() 
    for i in range(10): 
     exampleTab.row['id'] = i 
     exampleTab.row['value'] = i**2 
     exampleTab.row['timestamp'] = t + 0.5*i 
     exampleTab.row.append() 
    exampleTab.flush() 

IDL에서 읽기에서 내 시도이다 : 그것은 이미 값을 사용자 정의 데이터 유형을 얻을 수 있지만, 일단

fid = h5f_open(filename) 
exampleTab = H5D_OPEN(fid, '/example') 
; id: 32 bit signed integer, value: float32, timestamp: 8 byte value 
struct = {id:0L, value:0.0, timestamp:0LL} 
dt = H5T_IDL_CREATE(struct) 
exampleData = H5D_READ(exampleTab, dt) 
print, 'exampleData.id:', exampleData.id 
print, 'exampleData.value', exampleData.value 
print, 'exampleData.timestamp', exampleData.timestamp 
h5d_close, exampleTab 
h5f_close, fid 

H5D_READ 더 이상 질식하지 않습니다 idvalue 필드의 값이 왜곡됩니다. 이 인쇄 문에서 내가 얻을 출력 : 나는에 struct을 변경하는 경우

exampleData.id:   0   0   0 1095914052 174536304 153749104   0 172915600 1095914052 910565433 
exampleData.value  0.000000  0.000000  0.000000  13.1451  0.000000  0.000000  0.000000  0.000000  13.1451  640.894 
exampleData.timestamp      0      0      0 3833484811918717440  5858206660165639    153997792 
     5858318295760901    154274128 4051322254670378805  5858331130331138 

(I 동등한 정의를 믿는 것이 무엇) struct = {id:lonarr(1), value:0.0, timestamp:0LL}, 인쇄 문이 얻을 :

exampleData.id: 262404320   3 262404416   4 262404512   14   0 172915600 1095914052 910565433 
exampleData.value  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  0.000000  13.1451  640.894 
exampleData.timestamp      0      0      0 3833484811918717440      0    153997568 
     5858318295760901    154274128 4051322254670378805  791781549539330 
+0

Time64 열을 포함하는 파일을 다운로드 할 수 있습니까? – mgalloy

+0

예시적인 hdf5 파일 링크 : http://ubuntuone.com/3agm00xGNP9nKbcYJn90oD – bdoering

+0

필드가 왜곡되어 있습니까? 'print' 결과물을 볼 수 있습니까? 'H5Tpack'이 복합 형에서 호출되었는지 알고 있습니까? –

답변

0

내가 알아 낸 데이터 파일에서 timestamp 열을 읽는 방법. PyTables의 소스를 읽는 것이 포함되었습니다.

실제로 열이 HDF5 유형 H5T_UNIX_D64LE으로 작성된 것 같습니다. 또한 약간의 비트 이동이 있습니다.

다음
$ env TZ=UTC ./rtbl.py 
0 0.00 Wed Apr 9 08:56:24 2014 
1 1.00 Wed Apr 9 08:56:25 2014 
2 4.00 Wed Apr 9 08:56:25 2014 
3 9.00 Wed Apr 9 08:56:26 2014 
4 16.00 Wed Apr 9 08:56:26 2014 
5 25.00 Wed Apr 9 08:56:27 2014 
6 36.00 Wed Apr 9 08:56:27 2014 
7 49.00 Wed Apr 9 08:56:28 2014 
8 64.00 Wed Apr 9 08:56:28 2014 
9 81.00 Wed Apr 9 08:56:29 2014 

는 C에서 동일한 작업을 수행하기 위해 (rtbl.c) : 우리는 다음과 같은 얻을 수있는이 실행

#!/usr/env/bin python 

import tables as T 
import time 

exampleTableColumns = { 
    'id': T.Int32Col(pos=0), 
    'value': T.Float32Col(pos=1), 
    'timestamp': T.Time64Col(pos=2), 
    } 
with T.openFile('time64-example.h5', 'r') as h5: 
    for row in h5.root.example[:]: 
     print "%d\t%.2f\t%s" %(row['id'], row['value'], 
      time.ctime(row['timestamp'])) 

:

다음 ( rtbl.py)가 파일 time64-example.h5 덤프 파이썬 버전입니다 - 모든 하드 코딩 및 오류 점검을 용서하십시오.

#include <stdlib.h> 
#include <stdio.h> 
#include <hdf5.h> 
#include <time.h> 

struct row { 
    int id; 
    float value; 
    double time; 
}; 

double 
convert(double d) { 
    union { 
     double d; 
     long long i; 
    } di; 
    double f; 

    di.d = d; 
    f = 1e-6 * (int)di.i + (di.i >> 32); 
    return f; 
} 


int 
main(int argc, char **argv) 
{ 

    hid_t f_id; 
    hid_t d_id; 
    hid_t m_type; 
    herr_t err; 
    int i = 0; 
    struct row rows[10] = {0}; 
    time_t clock; 

    f_id = H5Fopen("time64-example.h5", H5F_ACC_RDONLY, H5P_DEFAULT); 

    m_type = H5Tcreate(H5T_COMPOUND, sizeof(struct row)); 
    err = H5Tinsert(m_type, "id",  HOFFSET(struct row, id), 
      H5T_STD_I32LE); 
    err = H5Tinsert(m_type, "value",  HOFFSET(struct row, value), 
      H5T_IEEE_F32LE); 
    err = H5Tinsert(m_type, "timestamp", HOFFSET(struct row, time), 
      H5T_UNIX_D64LE); 

    d_id = H5Dopen(f_id, "example", H5P_DEFAULT); 
    err = H5Dread(d_id, m_type, H5S_ALL, H5S_ALL, H5P_DEFAULT, rows); 

    for (i = 0; i < 10; ++i) { 
     clock = (time_t)convert(rows[i].time); 
     printf("%d: %d\t%.2f\t%s", i, 
       rows[i].id, rows[i].value, ctime(&clock)); 
    } 

    H5Dclose(d_id); 
    H5Fclose(f_id); 

    return(EXIT_SUCCESS); 
} 

이 같은 결과를 얻을 수 있습니다 :

$ h5cc -o rtbl rtbl.c && env TZ=UTC ./rtbl 
0 0.00 Wed Apr 9 08:56:24 2014 
1 1.00 Wed Apr 9 08:56:25 2014 
2 4.00 Wed Apr 9 08:56:25 2014 
3 9.00 Wed Apr 9 08:56:26 2014 
4 16.00 Wed Apr 9 08:56:26 2014 
5 25.00 Wed Apr 9 08:56:27 2014 
6 36.00 Wed Apr 9 08:56:27 2014 
7 49.00 Wed Apr 9 08:56:28 2014 
8 64.00 Wed Apr 9 08:56:28 2014 
9 81.00 Wed Apr 9 08:56:29 2014 

그래서 모두 다시 convert 루틴 및 H5T_UNIX_D64LE에 온다. 나는이 중 하나가 빅 엔디안에서 수행 되었다면 LEBE이어야한다고 감히 말합니다.

IDL을 사용하고 액세스 할 수 없어서 죄송 합니다만 도움이되기를 바랍니다.

+0

대단히 감사합니다. 그것은 pytables이 처음에 데이터를 쓰는 방법에 대한 세부 사항 중 일부를 정리합니다. 그럼에도 불구하고이 솔루션이 _IDL_에서 데이터를 읽는 데 어떻게 도움이되는지는 알 수 없습니다. 결국, 다른 언어 (C++ 또는 Java)로 작성된 메소드를 통합하여 IDL의 HDF5 데이터를 읽는 것이 좋습니다. – bdoering

+0

예, 저는이 문제가 _IDL_에서'H5T_UNIX_D64LE'을 읽는 방법을 확신하고 있다고 생각합니다. _IDL_에서 쉽게 코딩 할 수있는'convert'. 행운을 빕니다. –

관련 문제