我会发表评论以获得一些澄清,但我还没有代表。如果没有更多的上下文,我很难说你的方法是否明智,但我倾向于在几乎所有情况下都说不。如果我错了,请纠正我,但你想要做的是:
- 给定一个迭代列表:
[(timeA, key1, value1), (timeB, key1, value2), (timeC, key2, value1)]
- 您需要 HDFStore 中有两个 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),那么我的答案可能必须改变。
一般来说,这里的想法是在写入存储之前完整地创建每个数据帧。当我在这里完成时,我意识到您也可以做您选择的事情,而您缺少的部分是需要使用表格格式指定商店,这可以进行追加。当然,一次添加一行可能不是一个好主意。