PyTables检索最大值和最小值?

问题描述 投票:0回答:1

我创建了一个Python脚本,它从套接字接收时间序列数据并通过PyTables将其写入HDF5文件,如下所示:

#Define description object to pass to the table constructor
class DataPoint(tb.IsDescription):
    timestamp = tb.Time64Col() #UNIX timestamp
    value = tb.Float32Col() #Value

每次脚本运行时,它都会收到一些数据历史记录,这些数据历史记录先前已保存到文件中,同时还有新保存的未保存数据。我想确保文件中没有重复带时间戳的行,因此需要过滤到达时间。

为此,我需要检查文件中已存在的数据的范围,即存在的最大和最小时间戳值。

是否有人能够演示查询逻辑以检索具有最大和最小时间戳的行?

timestamp max min hdf5 pytables
1个回答
1
投票

在这里,一个简单的例子,使用floats演示将HDF5表/数据集读取到numpy数组,然后使用.max().min()运算符获取Max / Min,然后使用.argmax().argmin()获取每个的索引。我不熟悉Time64Col()的UNIX时间戳以及运算符的工作方式。我会告诉你的。 :-)

前两个示例使用不同的PyTables方法提取单个列。 第三种方法将整个表提取到一个数组,然后使用字段/列名称进行索引。 使用对您最有意义的技术。

请注意,数据是随机生成的,因此输出也是随机的。但是,第一种和第三种方法的输出应始终相同。

import tables as tb
import numpy as np

# Create h5 file with 1 dataset

h5f = tb.open_file('SO_55266365.h5', 'w')

mydtype = np.dtype([('param1',float),('param2',float),('param3',float)])

arr = np.random.rand(500,3)
recarr = np.core.records.array(arr,dtype=mydtype)

h5f.create_table('/', 'set1', obj=recarr )

# Close, then Reopen file READ ONLY
h5f.close()

h5f = tb.open_file('SO_55266365.h5', 'r')

# Get first column (param1)
p1 = h5f.root.set1.col('param1')
print ('param 1 Max = ' , p1.max(), 'at row =' , p1.argmax() )
print ('param 1 Min = ' , p1.min(), 'at row =' , p1.argmin() )

# Get second column (param2)
p2 = h5f.root.set1.read(field='param2')
print ('param 2 Max = ' , p2.max(), 'at row =' , p2.argmax() )
print ('param 2 Min = ' , p2.min(), 'at row =' , p2.argmin() )

# Get all 3 columns
# (index to get column when referencing the object)
p123 = h5f.root.set1.read()
print ('param 1 Max = ' , p123['param1'].max(), 'at row =' , p123['param1'].argmax() )
print ('param 1 Min = ' , p123['param1'].min(), 'at row =' , p123['param1'].argmin() )

h5f.close()
© www.soinside.com 2019 - 2024. All rights reserved.