我从不同的机器上采集时间序列数据,所以经常需要从另一个设备收集大量的高频数据,并将其附加到时间序列数据中。
假设我测量的是温度随时间的变化,然后每升高10度,我就在200 the取样一微,我希望能够将大量的微数据标记为时间序列数据中的时间戳。甚至是以数字的形式。
我正试图用regionref来做这件事,但我很难找到一个优雅的解决方案。我发现自己在熊猫店和h5py之间胡闹,感觉很乱。
一开始,我想我可以从突发数据中分离出数据集,然后在时间序列数据中使用引用或时间戳链接。但到目前为止还没有运气。
任何方法引用一大包数据到另一堆数据中的时间戳将不胜感激!

发布于 2022-06-17 16:45:45
如何使用区域引用?我假设您有一系列引用,引用在“标准速率”和“突发速率”数据之间交替。这是一种有效的办法,而且会奏效的。但是,您是正确的:创建数据很麻烦,恢复数据也很麻烦。
虚拟数据集可能是一个更优雅的solution....but跟踪,创建虚拟布局定义也可能变得混乱。-)但是,一旦您拥有虚拟数据集,您就可以使用典型的切片表示法来读取它。Hf5/h5py处理封面下的所有内容。
为了演示,我创建了一个“简单”示例(实现虚拟数据集并不“简单”)。尽管如此,如果您能够找到区域引用,则可以计算出虚拟数据集。下面是一个指向h5py虚拟数据集文档和示例的链接,以获取详细信息。以下是对这一进程的简短总结:
注意:虚拟数据集可以在单独的文件中,也可以在与引用的数据集相同的文件中。我将在这个例子中说明这两个问题。(一旦定义了布局和源,这两个方法都同样容易。)
关于这一主题,至少还有其他三个问题和答案:
示例如下:
步骤1:创建一些示例数据。如果没有您的模式,我猜您是如何存储“标准速率”和“突发速率”数据的。所有标准速率数据都存储在dataset 'data_log'中,每个突发存储在一个名为:'burst_log_##'的单独数据集中。
import numpy as np
import h5py
log_ntimes = 31
log_inc = 1e-3
arr = np.zeros((log_ntimes,2))
for i in range(log_ntimes):
time = i*log_inc
arr[i,0] = time
#temp = 70.+ 100.*time
#print(f'For Time = {time:.5f} ; Temp= {temp:.4f}')
arr[:,1] = 70.+ 100.*arr[:,0]
#print(arr)
with h5py.File('SO_72654160.h5','w') as h5f:
h5f.create_dataset('data_log',data=arr)
n_bursts = 4
burst_ntimes = 11
burst_inc = 5e-5
for n in range(1,n_bursts):
arr = np.zeros((burst_ntimes-1,2))
for i in range(1,burst_ntimes):
burst_time = 0.01*(n)
time = burst_time + i*burst_inc
arr[i-1,0] = time
#temp = 70.+ 100.*t
arr[:,1] = 70.+ 100.*arr[:,0]
with h5py.File('SO_72654160.h5','a') as h5f:
h5f.create_dataset(f'burst_log_{n:02}',data=arr)步骤2:这是定义虚拟布局和源并用于创建虚拟数据集的地方。这将创建一个虚拟数据集一个新文件和一个现有文件中的一个。(除了文件名和模式之外,语句是相同的。)
source_file = 'SO_72654160.h5'
a0 = 0
with h5py.File(source_file, 'r') as h5f:
for ds_name in h5f:
a0 += h5f[ds_name].shape[0]
print(f'Total data rows in source = {a0}')
# alternate getting data from
# dataset: data_log, get rows 0-11, 11-21, 21-31
# datasets: burst_log_01, burst log_02, etc (each has 10 rows)
# Define virtual dataset layout
layout = h5py.VirtualLayout(shape=(a0, 2),dtype=float)
# Map virstual dataset to logged data
vsource1 = h5py.VirtualSource(source_file, 'data_log', shape=(41,2))
layout[0:11,:] = vsource1[0:11,:]
vsource2 = h5py.VirtualSource(source_file, 'burst_log_01', shape=(10,2))
layout[11:21,:] = vsource2
layout[21:31,:] = vsource1[11:21,:]
vsource2 = h5py.VirtualSource(source_file, 'burst_log_02', shape=(10,2))
layout[31:41,:] = vsource2
layout[41:51,:] = vsource1[21:31,:]
vsource2 = h5py.VirtualSource(source_file, 'burst_log_03', shape=(10,2))
layout[51:61,:] = vsource2
# Create NEW file, then add virtual dataset
with h5py.File('SO_72654160_VDS.h5', 'w') as h5vds:
h5vds.create_virtual_dataset("vdata", layout)
print(f'Total data rows in VDS 1 = {h5vds["vdata"].shape[0]}')
# Open EXISTING file, then add virtual dataset
with h5py.File('SO_72654160.h5', 'a') as h5vds:
h5vds.create_virtual_dataset("vdata", layout)
print(f'Total data rows in VDS 2 = {h5vds["vdata"].shape[0]}')https://stackoverflow.com/questions/72654160
复制相似问题