【发布时间】:2018-07-08 17:11:01
【问题描述】:
我正在尝试在 python 中生成查询并使用它们进行查询。我正在使用 pandas_gbq。我的代码如下所示:
def generate_query(
filter=['CENTRAL BANK','DRAGHI','FRANKFURT'],
date ='20171214',
datetimeformat='%Y%m%d',
weekly_data=True
):
filter = str(filter).replace('[','').replace(']','')
if weekly_data == False:
query = '''SELECT * FROM `gdelt-bq.gdeltv2.events` WHERE SQLDATE = {date}'''.format(date = date)
else:
date = datetime.datetime.strptime(date, datetimeformat)
week = generate_week(date)
query = '''SELECT * FROM `gdelt-bq.gdeltv2.events` WHERE SQLDATE IN ({week})'''.format(
week = week).replace('[','').replace(']','')
return query, date
不知道如何在 stackoverflow 上缩进代码。尝试查询多个日期时出现问题:
'SELECT * FROM `gdelt-bq.gdeltv2.events` WHERE SQLDATE IN (\\'20171211\\', \\'20171212\\', \\'20171213\\', \\'20171214\\', \\'20171215\\')'
我不知道反斜杠是从哪里来的。知道为什么会这样吗?
函数 generate_week:
def generate_week(date):
week = []
referenceday = date - datetime.timedelta(days = date.weekday())
for i in range(0,5):
day = referenceday + datetime.timedelta(days = i)
week.append(day.strftime('%Y%m%d'))
return week
返回的错误如下:
pandas_gbq.gbq.GenericGBQException: Reason: 400 No matching signature for operator IN for argument types INT64 and {STRING} at [1:55]
我会非常感谢这里的一些帮助! :)
【问题讨论】:
-
您的方法
generate_week似乎无法正常工作。也许它也有助于发布它的代码。 -
我做到了。谢谢:)
-
这确实是一个你应该使用query parameters而不是操纵查询文本的情况。你会想使用例如
SQLDATE IN UNNEST(@dates)其中dates是ARRAY<STRING>参数。 -
我认为你是对的。使用通常的 Python API,我会知道如何实现这一点。知道如何用 pandas GBQ 做到这一点吗? :)
标签: python pandas google-bigquery