Google BigQuery API Python

2024-10-01 09:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试用python生成查询并用它们进行查询。我是熊猫队的队员。我的代码如下所示:

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\\')'

我不知道反斜杠是从哪里来的。知道为什么会这样吗?你知道吗

函数生成\u周:

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]

我将非常感谢您的帮助!:)


Tags: fromdatetimedatefiltereventswherequeryselect
1条回答
网友
1楼 · 发布于 2024-10-01 09:22:26

我相信你的问题是日期格式。除非另有规定,否则标准BQ要求yyyy mm dd格式。阅读更多here。如果你使用strftime("%Y-%m-%d"),那就足够了。你知道吗

同样值得指出的是:

  1. 如果您使用元组而不是列表,那么SQL将与Python共享相同的语法,因此您可以避免替换方括号(使操作更简单)。你知道吗
  2. 如果每个日期都是连续的、连续的时间段,则可以使用SQL的BETWEEN来表示开始日期和结束日期(包括开始日期和结束日期),而不是列出每个日期。你知道吗
  3. 如果您使用的是python3.6+f,那么在本例中,字符串要比.format好一点。包括项目符号1(而不是项目符号2)中的更改,您可以改为:

    从中选择-bq.gdeltv2版本.events“WHERE SQLDATE IN{week}'”

相关问题 更多 >