ibis对接BigQuery后端时如何给日期列添加指定时间间隔
解决方案
ibis 对接 BigQuery 后端时,.add() 方法的参数需要传入 ibis.interval() 构造的时间间隔对象,你可以按需求指定间隔的单位和数值:
- 加指定天数:
which_type_here = ibis.interval(days=7)表示加7天 - 加指定月数:
which_type_here = ibis.interval(months=3)表示加3个月 - 加指定年数:
which_type_here = ibis.interval(years=1)表示加1年 - 支持的单位还包括
weeks(周)、hours(小时)、minutes(分钟)、seconds(秒),可以同时指定多个单位,比如ibis.interval(weeks=1, days=2)表示加1周零2天
如果你的表中有整数类型的列存储需要累加的间隔数值,比如
day_offset列存每个行需要加的天数,可以直接按如下方式写,不需要单独定义变量:e = t.mutate(new_date=t.date.add(t.day_offset * ibis.interval(days=1)))
以下是修改后的完整可运行代码示例(以加14天为例):
import ibis import ibis_bigquery import pandas as pd import datetime as dt from google.cloud import bigquery # 原代码缺失该导入,需要补充 my_project = "your_project" my_dataset = 'your_dataset' conn = ibis_bigquery.connect( project_id=my_project, dataset_id=my_dataset) pdf = pd.DataFrame({'date': [dt.date(2020, 1, 1), dt.date(2020, 5, 19), dt.date(2021, 7, 9)], }) client = bigquery.Client(project=my_project) table = my_dataset + ".mytable" client.delete_table(table, not_found_ok=True) job = client.load_table_from_dataframe(pdf, table) job.result() # 等待数据导入完成,避免后续读取表失败 t = conn.table("mytable") # 示例:给日期列加14天 which_type_here = ibis.interval(days=14) e = t.mutate(new_date=t.date.add(which_type_here)) # 执行后可查看结果 print(e.execute())
- 上述写法会被ibis自动转换为BigQuery原生的
DATE_ADD语法,完全符合BigQuery的执行规范,不需要自定义SQL - 如果操作的是时间戳(timestamp)类型的列,同样适用该方法,支持更小的时间单位
内容的提问来源于stack exchange,提问作者jcmincke
相关产品推荐
相关产品推荐

