我在hdf5文件中将以下数据(18619211行)存储为pandas数据帧对象:
date id2 w
id
100010 1980-03-31 10401 0.000839
100010 1980-03-31 10604 0.020140
100010 1980-03-31 12490 0.026149
100010 1980-03-31 13047 0.033560
100010 1980-03-31 13303 0.001657
其中id
是索引,其他是列。date
是np.datetime64
。我需要执行这样的查询(代码当然不起作用):
db=pd.HDFStore('database.h5')
data=db.select('df', where='id==id_i & date>bgdt & date<endt')
注id_i, bgdt, endt
都是变量,不是实际值,需要在循环中传递。例如:
dates
是Pandas周期索引或时间戳索引,无论哪种方式,我都可以相互转换。
dates=['1990-01', 1990-04','1990-09',......]
id_list
是一个id列表
id_list=[100010, 100011,1000012,.......]
循环看起来是这样的(我做循环的原因是因为数据量很大,我同时查询了其他数据集,然后执行了一些操作)
db=pd.HDFStore('database.h5')
for id_i in id_list:
for date in dates:
bgdt=date-1 (move to previous month)
endt=date-60 (previous 60 month)
data=db.select('df', where='index==id_i & date>bgdt & date<endt')
......
这个问题有两个部分:
query
。文档基于level=0
或level=1
显示,但没有关于如何同时执行这两个操作的示例。)id_i, bgdt, endt
传递给查询。我只知道如何通过使用%s
来传递,但不是全部。
datetime.datetime
,numpy.datetime64
,pandas.Period
。我主要处理每月的数据,所以pandas.Period
是最有用的。但是我不能很容易地转换时间戳的列(不是索引)(从原始数据解析时熊猫的默认日期类型)。有没有任何数据类型是简单的“日期”,不是时间戳,不是期间,而是只有年、月和日的简单日期?很多麻烦,但我真的很喜欢python和pandas(我正试图将我的工作流从SAS移到python)。任何帮助都将不胜感激!
here是用于查询非索引列的文档。
创建测试数据。不清楚原始框架是如何构造的,例如它的唯一数据和范围,所以我创建了一个示例,其中有10行,还有一个带有id列的多级日期范围。
将数据写入磁盘,说明如何创建数据列(注意,索引是自动可查询的,这也允许id2可查询)。这实际上等同于做。这需要打开和关闭商店(您可以通过打开、追加和关闭商店来完成相同的任务)。
要查询列,它必须是数据列或帧的索引。
查询
可以将日期指定为字符串(内联或变量;还可以指定类似时间戳的对象)
您可以使用在线列表
也可以指定布尔表达式
为了回答你的实际问题,我会这样做(他们的信息确实不够,但我会提出一些合理的期望):
例如,假设您有1000个惟一的id,每个id有10000个日期,如我的示例所示。您要选择其中200个,日期范围为1000。
因此,在本例中,我只需选择日期,然后进行内存比较,如下所示:
您可能还拥有每个ID更改的日期。所以把它们分块,这次使用一个id列表。
像这样的:
然后,基本思想是使用所需的条件选择数据的超集,然后进行子选择以使其适合内存,但是您限制了查询的数量(例如,假设您最终选择了查询的一行,如果您必须查询这个18M次,那就太糟糕了)。
相关问题 更多 >
编程相关推荐