2013-06-10 36 views
5

Tôi đang cố gắng tạo một hàm cập nhật một DataFrame gấu trúc được lưu trữ mà tôi đã lưu trữ trong một PyTable với dữ liệu mới từ một DataFrame pandas. Tôi muốn kiểm tra xem một số dữ liệu bị thiếu trong PyTable cho DatetimeIndexes cụ thể (giá trị là NaN hoặc Dấu thời gian mới có sẵn), thay thế bằng giá trị mới từ một DataFrame gấu trúc đã cho và nối nó vào Pytable. Về cơ bản, chỉ cần cập nhật một Pytable. Tôi có thể lấy DataFrame kết hợp bằng phương thức combined_first trong Pandas. Dưới Pytable được tạo ra với dữ liệu giả:Cập nhật gấu trúc DataFrame được lưu trữ trong Pytable với gấu trúc khác DataFrame

import pandas as pd 
import numpy as np 
import datetime as dt 
index = pd.DatetimeIndex(start = dt.datetime(2001,1,1,0,0), periods = 20000,freq='10T') 
data_in_pytable = pd.DataFrame(index=index,data=np.random.randn(20000,2),columns=['value_1','value_2']) 
data.to_hdf(r'C:\pytable.h5','test',mode='r+',append=True,complevel=9,complib='zlib') 

Vì vậy, các pytable được tạo ra. Giả sử tôi đã khác dataFrame mà tôi muốn cập nhật Pytable với:

new_index = pd.DatetimeIndex(start = dt.datetime(2001,5,1,0,0), periods = 10000,freq='10T') 
data_to_update=pd.DataFrame(index=new_index,data=np.random.randn(10000,2),columns=['value_1','value_2']) 
store=pd.HDFStore(r'C:\pytable.h5',mode='r+',complevel=9,complib='zlib') 
store.append('test',store.select('test').combine_first(data_to_update)) 
store.close() 

Vấn đề là các PyTable giữ các giá trị ban đầu, không cập nhật những cái hiện có. Bây giờ tôi có các mục trùng lặp (theo chỉ số) vì các giá trị ban đầu không được ghi đè.

Tóm tắt: Làm cách nào để cập nhật PyTable bằng một DataFrame khác?

Xin cảm ơn, Elv

Trả lời

4

Cuối cùng, tôi đã tự tìm ra. Trong trường hợp của tôi, khi nó không quan trọng để ghi đè lên toàn bộ Node là "combine_first" giúp bạn bản gốc và các giá trị mới, nó là tốt để sử dụng

store.put(key,value,table=True,append=False) 

thay vì

store.append(key,value). 
2

Điều này hiện không được hỗ trợ. PyTables không hỗ trợ phương thức update, nhưng không được triển khai trong gấu trúc.

phương pháp dễ nhất là để thể sử dụng mode='w' và viết một tập tin mới hoặc

store.remove(key); store.append(.....)

HDF5 không phải là một cơ sở dữ liệu 'thông thường' và cập nhật không phải là một hoạt động phổ biến, nếu bạn cần mà SQL có thể là một Tùy chọn.

Vui lòng yêu cầu update làm phụ kiện.

+0

Thực tế, đó là giải pháp tạm thời của tôi. Cảm ơn bạn về thông tin – Elvin