首页 > 解决方案 > 使用 load_table_from_dataframe() 存储具有日期时间对象的数据帧时的架构冲突

问题描述

我正在尝试将 Pandas 中DataFrame的数据加载到 BigQuery 表中。有DataFrame一个 dtype 列datetime64[ns],当我尝试使用存储 df 时load_table_from_dataframe(),我得到

google.api_core.exceptions.BadRequest:400 提供的架构与表 [表名] 不匹配。字段 compute_triggered_time 已将类型从 DATETIME 更改为 TIMESTAMP。

该表具有读取的模式

CREATE TABLE `[table name]` (
  ...
  computation_triggered_time    DATETIME  NOT NULL,
  ...
)

在 中DataFramecomputation_triggered_time是一datetime64[ns]列。当我从 CSV 读取原件DataFrame时,我将其从文本转换为日期时间,如下所示:

df['computation_triggered_time'] = \ 
  df.to_datetime(df['computation_triggered_time']).values.astype('datetime64[ms]')

笔记:

.values.astype('datetime64[ms]')部分是必要的,因为load_table_from_dataframe()使用 PyArrow 序列化 df 并且如果数据具有纳秒精度则失败。错误类似于

[...] 从时间戳 [ns] 转换为时间戳 [ms] 会丢失数据

标签: pandasgoogle-cloud-platformgoogle-bigquerypyarrow

解决方案


这看起来像是谷歌的 google-cloud-python 包的问题,​​你能报告那里的错误吗?https://github.com/googleapis/google-cloud-python


推荐阅读