繁体   English   中英

Google BigQuery API Python

[英]Google BigQuery API Python

我正在尝试在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]

在此感谢我的帮助! :)

我相信您的问题在于日期格式。 除非您另外指定,否则标准BQ需要yyyy-mm-dd格式。 在这里阅读更多。 如果您使用strftime("%Y-%m-%d")就足够了。

还值得指出的是:

  1. 如果使用元组而不是列表,则SQL将与Python共享相同的语法,因此可以避免替换方括号(使生活更轻松)。
  2. 您可以将SQL的BETWEEN与开始日期和结束日期(包括两端)一起使用,而不是列出每个日期(如果它是连续的连续时间段)。
  3. 如果您使用的是Python 3.6+,则在这种情况下,f字符串比.format更好。 包括项目符号1(但不包括项目符号2)中的更改,您可以改为:

    f'''SELECT *从`gdelt-bq.gdeltv2.events`中{星期}开始SQLDATE

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM