2016-12-15 51 views
2

我有一些時間序列數據,我以前使用pytables存儲爲hdf5文件。我最近嘗試與h5py庫存儲相同。但是,由於numpy數組的所有元素都必須具有相同的dtype,因此在使用h5py庫進行存儲之前,必須將日期(通常是索引)轉換爲'float64'類型。 當我使用pytables時,索引及其dtype被保留下來,這使得我可以查詢時間序列而不需要將它全部放入內存中。我想用h5py這是不可能的。我在這裏錯過了什麼嗎?如果不是,我應該在什麼情況下使用h5py lib來存儲時間序列數據?我問這個問題的原因,澄清這可以幫助我設計一個更高效的(處理存儲明智的)項目。我應該如何使用h5py lib來存儲時間序列數據

下面

是簡單的代碼,在那裏我失去的索引信息,以便將其存儲爲一個單一的D類對象

dt_range = pd.date_range('2016-12-01','2016-12-10') 
data = np.arange(0,20).reshape(-1,2) 
df = pd.DataFrame(data,index = dt_range, columns = list('ab'), dtype = 'float') 
df.index = df.index.to_julian_date() 
df = df.reset_index() 
h = h5py.File(r'path\temp.h5', 'w') 
dset = h.create_dataset('temp',data = df.values, shape = (10,3)) 
+0

你可以用'h5py'來讀'tables'創建的文件嗎? – hpaulj

+0

雖然'h5py'可以識別通過'pytables'創建的文件(例如:h.keys()命令),但當我嘗試讀取相同的文件時(例如:h ['pytable-它會拋出這個錯誤:'AttributeError:'切片'對象沒有屬性'編碼' –

+0

我還沒有與'pytables'一起工作。 'h5py'使得文件數據的外觀和行爲與'numpy'數組相似。這就是你的'df.values'正在保存的內容。您可能還需要將大熊貓索引提取到數組中,然後編寫它。你知道很多'numpy',或者只是'pandas'嗎? – hpaulj

回答

1

我會用熊貓to_hdf

dt_range = pd.date_range('2016-12-01','2016-12-10') 
data = np.arange(0,20).reshape(-1,2) 
df = pd.DataFrame(data,index = dt_range, columns = list('ab'), dtype = 'float') 
df.index = df.index.to_julian_date() 
df = df.reset_index() 

with pd.HDFStore('temp.h5', 'w') as h: 
    df.to_hdf(h, 'temp') 

pd.read_hdf('temp.h5', 'temp') 

enter image description here

0

當我運行@piRSquared代碼,並用h5py看看文件我看到:

In [4]: import h5py 
In [5]: f=h5py.File('temp.h5') 

In [8]: list(f.keys()) 
Out[8]: ['temp'] 
In [9]: f['temp'] 
Out[9]: <HDF5 group "/temp" (4 members)> 
In [10]: list(f['temp'].keys()) 
Out[10]: ['axis0', 'axis1', 'block0_items', 'block0_values'] 

In [11]: f['temp']['axis0'][:] 
Out[11]: 
array([b'index', b'a', b'b'], 
     dtype='|S5') 
In [12]: f['temp']['axis1'][:] 
Out[12]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=int64) 
In [13]: f['temp']['block0_items'][:] 
Out[13]: 
array([b'index', b'a', b'b'], 
     dtype='|S5') 
In [14]: f['temp']['block0_values'][:] 
Out[14]: 
array([[ 2.45772350e+06, 0.00000000e+00, 1.00000000e+00], 
     [ 2.45772450e+06, 2.00000000e+00, 3.00000000e+00], 
     [ 2.45772550e+06, 4.00000000e+00, 5.00000000e+00], 
     [ 2.45772650e+06, 6.00000000e+00, 7.00000000e+00], 
     [ 2.45772750e+06, 8.00000000e+00, 9.00000000e+00], 
     [ 2.45772850e+06, 1.00000000e+01, 1.10000000e+01], 
     [ 2.45772950e+06, 1.20000000e+01, 1.30000000e+01], 
     [ 2.45773050e+06, 1.40000000e+01, 1.50000000e+01], 
     [ 2.45773150e+06, 1.60000000e+01, 1.70000000e+01], 
     [ 2.45773250e+06, 1.80000000e+01, 1.90000000e+01]]) 

所以它已保存在3個系列的索引信息,並且在另一箇中的值,它加載作爲2D numpy的陣列。

這是我期望從pytables創建的文件中看到的同一種信息。

根據它的文檔,pd.HDFStore正在使用pytables

+0

是的,我在問題中提到我使用pytables,實際上我通過'pd.HDFStore'函數使用pytables。幾乎與@piRSquared提供的解決方案几乎相同。但我真正的疑問是,如果我使用h5py,因爲我在進程中丟失了日期dtype信息,我無法查詢我的對象 - 基於日期範圍的對象 - 就像我可以使用pd.HDFStore一樣。 –

+0

我通過'h5py'得到的是數組。我沒有展示團隊和系列的'attrs'。假設用'h5py',我可以讀取重建與源代碼大致匹配的DataFrame所需的所有內容,並允許我按照需要「查詢」它。如果使用'h5py','HDFStore'正在處理你必須明確處理的細節。 – hpaulj

相關問題