【发布时间】:2014-07-14 20:08:48
【问题描述】:
我将以下数据(18,619,211 行)作为 pandas 数据框对象存储在 hdf5 文件中:
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 Period 索引或时间戳索引,无论哪种方式,我都可以相互转换。
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')
......
这个问题有两个部分:
- 我不知道如何同时查询索引和列。 pandas 中的文档展示了如何根据索引条件或列条件进行查询,但没有关于如何在同一时间根据它们进行查询的示例。
- (顺便说一句,这在 Pandas 文档中很常见。文档通常显示非常简单的内容,例如如何执行“A”或如何执行“B”,但不显示如何同时执行“A”和“B” . 一个很好的例子是在 MultiIndex pandas 数据帧上使用
query。文档显示基于level=0或level=1,但没有关于如何在同一时间执行这两个操作的示例。)
- (顺便说一句,这在 Pandas 文档中很常见。文档通常显示非常简单的内容,例如如何执行“A”或如何执行“B”,但不显示如何同时执行“A”和“B” . 一个很好的例子是在 MultiIndex pandas 数据帧上使用
- 我不知道如何将三个变量
id_i, bgdt, endt传递给查询。我只知道如何使用%s传递,但不是全部。- 我也对 datetime 数据类型有些困惑。似乎有不少日期时间:
datetime.datetime、numpy.datetime64、pandas.Period。我主要处理月度数据,所以pandas.Period是最有用的。但是我不能轻易转换时间戳的列(不是索引)(从原始数据解析时 Pandas 的默认日期类型)。是否有任何数据类型只是一个“日期”,而不是时间戳,不是期间,而只是一个只有年、月和日的简单 DATE?
- 我也对 datetime 数据类型有些困惑。似乎有不少日期时间:
很多麻烦,但我真的很喜欢 python 和 pandas(我正在尝试将我的工作流程从 SAS 转移到 Python)。任何帮助将不胜感激!
【问题讨论】:
-
你说你在循环中这样做;很好地举一个你正在做什么的例子,例如你正在做什么单独的查询(使用实际值);你为什么要循环播放?
-
@Jeff ,我刚刚编辑了问题以给出循环示例。我循环的原因是避免将大量数据读入内存。我只是举个小例子,真正的操作需要查询几个这样的数据集,不可能塞进内存。
-
也显示 ptdump -av
;查看您定义为数据列的内容 -
嗨@jeff,首先我不知道该怎么做....其次,我认为这不会有帮助
-
你输入“ptdump -av file.h5”并在你的问题中发布输出;显示更多信息总是更好(这很重要);这是 PyTables 安装的脚本
标签: python datetime pandas hdf5 pytables