本文详解如何解决使用 `pandas.dataframe.to_gbq()` 向 bigquery 写入数据时因 `pyarrow.lib.arrowtypeerror`(如“str cannot be converted to int”)引发的字段类型不匹配问题,涵盖数据类型对齐、日期列处理、空值与隐式类型转换陷阱等关键实践。
在将 Pandas DataFrame 推送至 BigQuery 时,即使 df.dtypes 显示类型看似合理,仍可能因 PyArrow 类型推断机制与 BigQuery Schema 的严格匹配要求而失败。典型错误如:
pyarrow.lib.ArrowTypeError: object of type <class 'str'> cannot be converted to int
该错误并非源于 DataFrame 中存在明显字符串值(如 “camp_id”: “2”),而常由隐式类型不一致或未被正确解析的日期列触发——正如本例中 crawl_date 字段:虽然已调用 .dt.date 转为 datetime.date 对象,但 Pandas 将其存储为 object dtype,PyArrow 无法自动映射为 BigQuery 的 DATE 类型,进而导致后续字段(如 camp_id)的类型校验链式失败。
✅ 正确做法:显式转换 + 类型对齐
BigQuery 要求 DATE 字段必须由 datetime64[ns](带时区或无时区)类型提供,不能是 object 类型的 date 对象。因此,应保留 datetime64[ns] 类型,并让 BigQuery 自动截取日期部分:
# ❌ 错误:转为 date 后 dtype=object,PyArrow 无法识别为 DATE df['crawl_date'] = pd.to_datetime(df['crawl_date']).dt.date # → object # ✅ 正确:保持 datetime64[ns],BigQuery to_gbq 会自动处理为 DATE df['crawl_date'] = pd.to_datetime(df['crawl_date']) # → datetime64[ns]
同时,需确保所有数值列严格匹配目标 Schema: