使用python/pandas将数据帧写入google工作表

使用python/pandas将数据帧写入google工作表,python,pandas,google-sheets,google-sheets-api,Python,Pandas,Google Sheets,Google Sheets Api,我正在使用谷歌工作表来保存共享项目的数据。我使用Google的Sheets API访问数据,用python处理数据,并尝试使用function writer中的更新Sheets文件 如果我将此函数数据作为列表传递,它将按预期工作 如果我传递一个数据帧(如我所愿),我会得到:TypeError:dataframe类型的对象不是JSON可序列化的 如果我使用.to_json(),我会得到以下结果: GoogleAppClient.errors.HttpError: 任何指点都将不胜感激 impo

我正在使用谷歌工作表来保存共享项目的数据。我使用Google的Sheets API访问数据,用python处理数据,并尝试使用function writer中的更新Sheets文件

  • 如果我将此函数数据作为列表传递,它将按预期工作
  • 如果我传递一个数据帧(如我所愿),我会得到:
    TypeError:dataframe类型的对象不是JSON可序列化的
  • 如果我使用
    .to_json()
    ,我会得到以下结果:
GoogleAppClient.errors.HttpError:

任何指点都将不胜感激

import pickle
import os.path
import pandas as pd
from googleapiclient.discovery import build
from google_auth_oauthlib.flow import InstalledAppFlow
from google.auth.transport.requests import Request
from pprint import pprint

# If modifying these scopes, delete the file token.pickle.
SCOPES = ['https://www.googleapis.com/auth/spreadsheets']

# Spreadsheet ID: https://docs.google.com/spreadsheets/d/XXX/edit#gid=0
SPREADSHEET_ID = 'XXX'
RANGE_NAME = 'contacts'

def writer(df):
    service = build('sheets', 'v4', credentials=gsheet_api(SCOPES))
    sheet_name = 'contacts'
    data = [{'range' : sheet_name, 'values' : df}]
    batch_update_values_request_body = {
        'value_input_option': 'RAW',
        'data': data }

    request = service.spreadsheets().values().batchUpdate(spreadsheetId=SPREADSHEET_ID,
                                                          body=batch_update_values_request_body)
    response = request.execute()
    pprint(response)

df = [[1, 2, 3, 4]]
writer(df)

我相信你的目标和情况如下

  • 您希望使用带有Python的googleapis将数据帧放到Google电子表格中
  • 您已经能够使用Sheets API获取和输入Google电子表格的值
对于这个问题,这个答案如何

修改点:
  • 我不确定数据帧的值。因此,在这个回答中,我想使用下面的示例数据帧解释修改点

         A  B  C
      0  1  2  3
      1  4  5  6
      2  7  8  9
    
  • 不幸的是,dataframe不能直接用于方法“spreadsheets.values.batchUpdate”的请求主体。因此,在这种情况下,需要将数据帧转换为二维数组。为此,我使用了
    tolist()

当使用示例数据帧修改脚本时,它将变成如下所示

修改脚本: 发件人: 致: 注:
  • 如果您不想包含标题行,请按如下修改。
    •   values = [df.columns.values.tolist()]
        values.extend(df.values.tolist())
      
    •   values = df.values.tolist()
      
参考资料:

谢谢,塔奈克,太好了。@HamishCrichton谢谢你的回复。我很高兴您的问题得到了解决。请注意,如果您有datetimes并出现错误
TypeError:Timestamp类型的对象不是JSON可序列化的
,只需将相关字段转换为
'str'
,首先:
df=df.astype('str')
(将转换所有列)。
  values = [df.columns.values.tolist()]
  values.extend(df.values.tolist())
  values = df.values.tolist()