JSON Сериализуемая ошибка - Автоматическое обновление данных на листе Google - PullRequest
0 голосов
/ 23 апреля 2020

Я хотел бы использовать python для подключения данных из Excel к Google Sheet.

Но я получил ошибку "Ошибка типа: объект типа datetime не JSON serializable"

Я предполагаю, что ошибка произошла в соответствии с "wks.update_cells (cell_list)". Могу ли я узнать, как решить эту ошибку? Спасибо

import os
import pandas as pd
import glob
import datetime
import numpy as np
import time
import gspread
from oauth2client.service_account import ServiceAccountCredentials
import json

def numberToLetters(q):
    q = q - 1
    result = ''
    while q >= 0:
        remain = q % 26
        result = chr(remain+65) + result;
        q = q//26 - 1
    return result


current_path = os.getcwd()
raw_df = pd.read_excel(glob.glob(os.path.join(current_path , 'Studio*'))[0],sheet_name = "Dashboard", encoding = "ISO-8859-1")
df = raw_df.replace(np.nan, '', regex=True)

scope = ['https://spreadsheets.google.com/feeds',
        'https://www.googleapis.com/auth/drive']
credentials = ServiceAccountCredentials.from_json_keyfile_name('startup_funding.json', scope)

gc = gspread.authorize(credentials)

wks = gc.open("Testing_Dashboard_Upload").sheet1

wks.clear()
columns = df.columns.values.tolist()
# selection of the range that will be updated
cell_list = wks.range('A1:'+numberToLetters(len(columns))+'1')


# modifying the values in the range
for cell in cell_list:
    val = columns[cell.col-1]
#    if type(val) is str:
#        val = val.decode('utf-8')
    cell.value = val

# update in batch
wks.update_cells(cell_list)


#4. handle content

# number of lines and columns
num_lines, num_columns = df.shape
# selection of the range that will be updated
cell_list = wks.range('A2:'+numberToLetters(num_columns)+str(num_lines+1))
# modifying the values in the range
for cell in cell_list:
    val = df.iloc[cell.row-2,cell.col-1]
    if isinstance(val, (np.float64, np.int64, np.bool_ )):
#        val = np.asscalar(val)
#        DeprecationWarning: np.asscalar(a) is deprecated since NumPy v1.16, use a.item() instead 
        val = val.item()
    cell.value = val

#5. update in batch

wks.update_cells(cell_list)

1 Ответ

0 голосов
/ 23 апреля 2020

Python json библиотека не будет сериализовать объект datetime. Вы должны сделать это самостоятельно. Узнайте, какое значение в cell_list является datetime, и преобразуйте его в строку, используя метод strftime. Из вашего кода я думаю, что вы устанавливаете cell.value для объекта datetime. Если это так, вы можете изменить строку

    cell.value = val

на

if isinstance(val, datetime.datetime):
    val = val.strftime("%m/%d/%Y, %H:%M:%S")
cell.value = val
...