明確にするためにコメントしたいのですが、まだ担当者がいません。もう少し文脈がないと、あなたのアプローチが賢明かどうかを言うのは難しいですが、ほとんどすべての場合、ノーと言う傾向があります. 私が間違っている場合は修正してください。ただし、あなたがやろうとしていることは次のとおりです。
- イテラブルのリストが与えられた場合:
[(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
- HDFStore に 2 つの df が必要です。
store[key1] = DataFrame([value1, value2], index=[timeA, timeB])
store[key2] = DataFrame([value1], index=[timeC])
正しい?
もしそうなら、私がお勧めするのは、次のように、ストアキーで何らかの「フィルタリング」を行い、データフレームを作成してから、データフレーム全体をストアに書き込むことです。
dataTuples = [(0, 'x', 5), (1, 'y', 6), ...]
# initializing the dict of lists, which will become a dict of df's
sortedByStoreKey = {storeKey: [] for idx, storeKey, val in dataTuples}
for idx, storeKey, val in dataTuples:
sortedByStoreKey[storeKey].append([idx, storeKey]) # appending a 2-list to a list
# this can all be done with dict comprehensions but this is more legible imo
for storeKey, dfContents in sortedByStoreKey.items():
df = pd.DataFrame(dfContents, columns=['time', 'value'])
df['time'] = pd.to_datetime(df['time']) # make sure this is read as a pd.DatetimeIndex (as you said you wanted)
df.set_index('time', inplace=True)
sortedByStoreKey[storeKey] = df
# now we write full dataframes to HDFStore
with pd.HDFStore('xxx') as store:
for storeKey, df in sortedByStoreKey.values():
store[storeKey] = df
行数の点でもリソースの点でも、これを行うためのより効率的な方法があると確信していますが、これが最もpythonicだと思います。オブジェクトが巨大な場合dataTuples
(>= RAM など)、答えを変更する必要があるかもしれません。
一般的に言えば、ここでの考え方は、ストアに書き込む前に各データフレームを完全に作成することです。私がここで仕上げているとき、私はあなたが選択したこともできることに気づきました.あなたが見逃しているのは、追加を可能にするテーブル形式でストアを指定する必要があることです. 確かに、一度に 1 行ずつ追加することは、おそらく良い考えではありません。