【发布时间】:2020-05-03 12:33:12
【问题描述】:
我正在使用 jupyter notebook 将数据从数据库中提取到 Pandas DataFrame 中以进行数据分析。
由于每天db中的数据量很大,为了避免超时,我只能一次性运行一天的查询。我需要暂停,重新运行,第二天。并这样做,直到我涵盖了所有日期(3个月)。
这是我当前的代码:它读取带有 x,y,z 作为日期标题的数据帧。
df = pd.read_sql_query("""SELECT x, y, z FROM dbName
WHERE type='z'
AND createdAt = '2019-10-01' ;""",connection)
如何将这种日期增量传递给 sql 查询并继续运行它直到到达结束日期。
我的伪代码类似于
query = """ select x,y, z...."""
def doaloop(query, date, enddate):
while date < enddate
date+timedelta
【问题讨论】:
-
"但是每天的数据太多了,和数据库的连接超时。通过一些实验,我似乎可以一次查询大约一天或一次查询 4000 行。"这不正常。除非您有充分的理由认为这是正常行为(例如您的连接受到限制),否则您应该尝试修复它。
-
我认为您已经很清楚地将其分解为单独的部分:将日期范围纳入查询,遍历这些日期范围,并将结果组合在一起。您通常应该问最简单的问题。如果您可以提出三个单独的问题(或者更好的是,在其他地方找到答案,因为我认为这些问题已经被问过了!),您应该这样做。
-
不确定您的实际问题是什么,但
from_sql的chunksize选项可能会有所帮助。df_iterator = pd.read_sql(query_text, connection, chunksize=4000)。然后,您可以使用df = pd.concat([chunk for chunk in df_iterator组装整个东西。这将按顺序读取查询结果。 -
@TCProctor 谢谢,我不明白为什么除了工程给我的解释之外“你获取的数据很大,因此它会超时”我会尽量简化这个问题.
-
如果您的数据实际上太大以至于单个查询的检索需要足够长的时间以保证超时,那么一旦您尝试组装它,您可能会遇到一些内存问题在熊猫中。