我如何编写一个 python/pandas 循环来将 sql 查询中的日期增加一天
Posted
技术标签:
【中文标题】我如何编写一个 python/pandas 循环来将 sql 查询中的日期增加一天【英文标题】:How do i write a python / pandas loop to increment the date in a msql query by one day 【发布时间】: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 谢谢,我不明白为什么除了工程给我的解释之外“你获取的数据很大,因此它会超时”我会尽量简化这个问题.
如果您的数据实际上太大以至于单个查询的检索需要足够长的时间以保证超时,那么一旦您尝试组装它,您可能会遇到一些内存问题在熊猫中。
【参考方案1】:
我做了类似这样的事情,而不是传入变量,这可能更简洁,但在某些方面对我的某些目的有所限制,所以我只是对查询进行了直接字符串替换。它看起来有点像这样,而且效果很好:
querytext = """SELECT x, y, z FROM dbName
WHERE type='z'
AND createdAt BETWEEN ~StartDate~ AND ~EndDate~;"""
querytext = querytext.replace("~StartDate~", startdate)
querytext = querytext.replace("~EndDate~", enddate)
df = pd.read_sql_query(querytext,connection)
alldf = alldf.append(df, ignore_index=True)
您需要将其放入循环中并创建要循环的日期列表。
如果您有任何问题,请告诉我!
【讨论】:
谢谢,但我不太明白。语法 ~abc~ 是用来表示可以替换的字符串吗?我需要在循环中放入什么? 是的,它只是查询字符串中的唯一标识符。从字面上看,它可以是您需要的任何东西,我选择了一个波浪词波浪选项,以确保它对于以后的替换命令是唯一可识别的。所有这些代码都需要在循环中。您需要一个日期列表来循环并作为开始日期/结束日期值输入。 仅供参考,pythonic 的方法是使用string formatting 或f strings 而不是.replace
正是@T.C.Proctor,我决定走这条路,这只是一个很小的替换操作。两者我都用过,但有时必要性是必要性之母,当然也是所有必要性之母。
使用 f 个字符串,您可以在一行中编写一些可读性很强的代码,而不必担心替换或格式化。以上是关于我如何编写一个 python/pandas 循环来将 sql 查询中的日期增加一天的主要内容,如果未能解决你的问题,请参考以下文章
Python、Pandas:80/20 随机拆分数据;当索引值“丢失”时如何循环?
Python:通过以更特定于 Pandas 的方式编写代码来简化代码