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
相关产品推荐
相关产品推荐

