You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MacOS正常的Pandas代码迁移Windows后to_gbq因类型不一致报错

问题:Pandas代码迁移Windows后to_gbq写入BigQuery报错

我的Python/Pandas代码在MacOS上运行正常,但迁移到Windows后,调用to_gbq写入Google Big Query时报错,核心是类型不匹配,同时发现Mac和Windows上的DataFrame索引存在差异。


代码片段

import math

def formatNumber(x):
    if math.isnan(x):
        f_number = 0.0
    else:
        f_number = str(round(x, 8))

    return f_number


... <从文件读取df> ...

print("A")
print(df.info())
df['Date'] = [x.date().strftime("%Y-%m-%d") for x in df['Date']]
df['A'] = [formatNumber(x) for x in df['A']]

# 去重
print(df.shape)
df = df.drop_duplicates()
print(df.shape)

# 上传到BigQuery
print("B")
print(df.info())

table_schema = [{
    'name': 'Date',
    'type': 'date'
}, {
    'name': 'A',
    'type': 'numeric'
}, {
    'name': 'B',
    'type': 'string'
}]


df.to_gbq('tablename',
                 'dbname',
                 chunksize=None,
                 if_exists='replace',
                 table_schema=table_schema,
                 credentials=credentials
                 )

执行输出

A
<class 'pandas.core.frame.DataFrame'>
Int64Index: 82624 entries, 0 to 9
Data columns (total 13 columns):
 #   Column                   Non-Null Count  Dtype
---  ------                   --------------  -----
 0   Date                     82624 non-null  datetime64[ns]
 1   A                        82624 non-null  float64
 2   B                        80769 non-null  object
 ...

dtypes: datetime64[ns](1), float64(6), object(6)
memory usage: 8.8+ MB
None
(82624, 13)
(82624, 13)

[5 rows x 13 columns]
B
<class 'pandas.core.frame.DataFrame'>
Int64Index: 82624 entries, 0 to 9
Data columns (total 13 columns):
 #   Column                   Non-Null Count  Dtype
---  ------                   --------------  -----
 0   Date                     82624 non-null  datetime64[ns]
 1   A                        82624 non-null  object
 2   B                        80769 non-null  object
 ...

dtypes: datetime64[ns](1), float64(6), object(6)
memory usage: 8.8+ MB

报错信息

File "pyarrow\array.pxi", line 1044, in pyarrow.lib.Array.from_pandas
  File "pyarrow\array.pxi", line 316, in pyarrow.lib.array
  File "pyarrow\array.pxi", line 83, in pyarrow.lib._ndarray_to_array
  File "pyarrow\error.pxi", line 123, in pyarrow.lib.check_status
pyarrow.lib.ArrowTypeError: Expected bytes, got a 'datetime.time' object

跨平台索引差异

  • MacOS:
    • 处理前(A阶段):Int64Index,82624条记录,索引范围0到1015
    • 处理后(B阶段):RangeIndex,1016条记录,索引范围0到1015
  • Windows:
    • 处理前后(A、B阶段):均为Int64Index,82624条记录,索引范围0到9

解决方案

1. 修复Date列类型转换问题

原列表推导式未正确更新列类型,导致Date列仍为datetime64类型,改用Pandas内置方法实现跨平台一致的类型转换:

# 方法1:转成BigQuery兼容的字符串格式日期
df['Date'] = pd.to_datetime(df['Date']).dt.strftime("%Y-%m-%d")
# 方法2:直接转成date类型(更匹配BigQuery的date schema)
df['Date'] = pd.to_datetime(df['Date']).dt.date

2. 修复A列类型不匹配

formatNumber函数返回值混合字符串和浮点数,导致A列成为object类型,与BigQuery的numeric类型冲突。修改函数统一返回数值类型:

def formatNumber(x):
    if math.isnan(x):
        return 0.0
    else:
        return round(x, 8)

# 或者用矢量化操作提升效率
df['A'] = df['A'].apply(lambda x: 0.0 if math.isnan(x) else round(x, 8))
# 强制转换为数值类型
df['A'] = df['A'].astype(float)

3. 解决索引异常问题

Windows上索引范围异常说明文件读取时可能存在索引解析错误,读取文件时禁用自动索引解析:

# 示例:读取CSV时指定
df = pd.read_csv('your_file.csv', index_col=False)

去重后重置索引,避免跨平台索引行为差异:

df = df.drop_duplicates().reset_index(drop=True)

4. 预验证列类型

调用to_gbq前确认列类型与schema匹配:

print("最终列类型检查:")
print(df.dtypes)
# 确保Date为字符串/date类型,A为数值类型,B为object类型

内容的提问来源于stack exchange,提问作者dtam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:50:36