Matlab或IDL用户可以处理Python日期时间对象吗?

时间:2014-03-05 07:22:53

标签: python datetime pandas hdf5

遗憾的是我无法检查这一点,因为我没有IDL或Matlab许可证,这就是我在这里问的原因。

场景是我用pandas保存HDF5文件,其中一列是Python日期时间对象。 IDL和Matlab有很好的HDF5读取库(至少我听说过),但IDL / Matlab用户是否可以对HDF5文件中的datetime对象做任何有用的事情?

1 个答案:

答案 0 :(得分:2)

In [28]: df = DataFrame({ 'A' : np.random.rand(5), 
                          'B' : range(5), 
                          'C' : date_range('20130101',periods=5,freq='T')})

In [29]: df
Out[29]: 
          A  B                   C
0  0.067509  0 2013-01-01 00:00:00
1  0.872840  1 2013-01-01 00:01:00
2  0.379634  2 2013-01-01 00:02:00
3  0.552827  3 2013-01-01 00:03:00
4  0.996150  4 2013-01-01 00:04:00

[5 rows x 3 columns]

In [30]: df.dtypes
Out[30]: 
A           float64
B             int64
C    datetime64[ns]
dtype: object

写出Table格式。

In [32]: df.to_hdf('test.h5','df',mode='w',format='table')

显示文件的内部结构

In [33]: !ptdump -avd test.h5
/ (RootGroup) ''
  /._v_attrs (AttributeSet), 4 attributes:


n [32]: df.to_hdf('test.h5','df',mode='w',format='table')

In [33]: !ptdump -avd test.h5
/ (RootGroup) ''
  /._v_attrs (AttributeSet), 4 attributes:
   [CLASS := 'GROUP',
    PYTABLES_FORMAT_VERSION := '2.1',
    TITLE := '',
    VERSION := '1.0']
/df (Group) ''
  /df._v_attrs (AttributeSet), 14 attributes:
   [CLASS := 'GROUP',
    TITLE := '',
    VERSION := '1.0',
    data_columns := [],
    encoding := None,
    index_cols := [(0, 'index')],
    info := {1: {'type': 'Index', 'names': [None]}, 'index': {}},
    levels := 1,
    nan_rep := 'nan',
    non_index_axes := [(1, ['A', 'B', 'C'])],
    pandas_type := 'frame_table',
    pandas_version := '0.10.1',
    table_type := 'appendable_frame',
    values_cols := ['values_block_0', 'values_block_1', 'values_block_2']]
/df/table (Table(5,)) ''
  description := {
  "index": Int64Col(shape=(), dflt=0, pos=0),
  "values_block_0": Float64Col(shape=(1,), dflt=0.0, pos=1),
  "values_block_1": Int64Col(shape=(1,), dflt=0, pos=2),
  "values_block_2": Int64Col(shape=(1,), dflt=0, pos=3)}
  byteorder := 'little'
  chunkshape := (2048,)
  autoindex := True
  colindexes := {
    "index": Index(6, medium, shuffle, zlib(1)).is_csi=False}
  /df/table._v_attrs (AttributeSet), 19 attributes:
   [CLASS := 'TABLE',
    FIELD_0_FILL := 0,
    FIELD_0_NAME := 'index',
    FIELD_1_FILL := 0.0,
    FIELD_1_NAME := 'values_block_0',
    FIELD_2_FILL := 0,
    FIELD_2_NAME := 'values_block_1',
    FIELD_3_FILL := 0,
    FIELD_3_NAME := 'values_block_2',
    NROWS := 5,
    TITLE := '',
    VERSION := '2.7',
    index_kind := 'integer',
    values_block_0_dtype := 'float64',
    values_block_0_kind := ['A'],
    values_block_1_dtype := 'int64',
    values_block_1_kind := ['B'],
    values_block_2_dtype := 'datetime64',
    values_block_2_kind := ['C']]
  Data dump:
[0] (0, [0.06750856214219292], [0], [1356998400000000000])
[1] (1, [0.8728395428343044], [1], [1356998460000000000])
[2] (2, [0.37963409103250334], [2], [1356998520000000000])
[3] (3, [0.5528271410494643], [3], [1356998580000000000])
[4] (4, [0.9961498806897623], [4], [1356998640000000000])
从UTC中的纪元开始,

datetime64[ns]被序列化为纳秒,并存储为int64列类型(这与numpy存储基础数据相同)。所以它非常简单,因为它是标准的HDF5格式。但是,您需要解释元数据。请参阅pandas/io/pytables.py中的源文件。

基本上你会寻找datetime64种类的块(那种类型的地图可以找到)。然后你可以在IDL / matlab中进行反向转换(在pandas中你会做pd.to_datetime(ns_since_epoch,unit='ns')。时区有点棘手,因为值是UTC,时区存储在info属性中。

注意:对Fixed格式的元数据的解释略有不同,或者如果您有data_columns(但不是很难)。