2013-06-10 5 views
5

Я пытаюсь создать функцию, которая обновляет хранимую в Pandas DataFrame, которую я сохранил в PyTable, с новыми данными из pandas DataFrame. Я хочу проверить, отсутствуют ли некоторые данные в PyTable для определенных DatetimeIndexes (значение NaN или новая временная метка), замените это новыми значениями из заданного панда DataFrame и добавьте это в Pytable. В принципе, просто обновите Pytable. Я могу получить объединенный DataFrame, используя метод comb_first в Pandas. Ниже Pytable создается с фиктивными данными:Обновление pandas DataFrame в хранилище в Pytable с помощью другого pandas 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') 

Так pytable создается. Предполагая, что я другой dataFrame, с которым я хочу обновить Pytable с:

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() 

Проблема заключается в том, что PyTable сохраняет исходные значения, не обновляет существующие. Теперь у меня есть повторяющиеся записи (по индексу), потому что исходные значения не перезаписываются.

Основная информация: Как обновить PyTable с помощью другого DataFrame?

Спасибо, Elv

ответ

4

В конце концов, я нашел это сам. В моем случае, когда оно хорошо перезаписать весь узел, как «combine_first» получает вас оригинал и новые ценности, это прекрасно использовать

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

вместо из

store.append(key,value). 
2

Это не поддерживается в настоящее время. PyTables действительно поддерживает метод update, но не применяется в пандах.

Самый простой метод либо использовать mode='w' и записать новый файл или

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

HDF5 не является «правильной» базы данных и обновление не является обычной операцией, если вам нужно что SQL может быть вариант.

Не стесняйтесь оформить заявку update как совершенствование как проблему.

+0

Фактически это было моим временным решением. Спасибо за информацию – Elvin

Смежные вопросы