Python 我如何处理;类型为'的对象;时间戳';不是JSON可序列化的“;巨蟒/熊猫?

Python 我如何处理;类型为'的对象;时间戳';不是JSON可序列化的“;巨蟒/熊猫?,python,pandas,pyodbc,google-sheets-api,google-api-python-client,Python,Pandas,Pyodbc,Google Sheets Api,Google Api Python Client,序言:Python非常新,但感谢您的帮助 下面是一段代码片段,我试图对MSSQL服务器表执行SQL查询,并将其发回GoogleSheets。我能够检索数据和标题,我想我几乎已经找到了答案。但是,我对某些列的datetime格式有一些问题。我收到的错误是: Traceback (most recent call last): File "modelhome.py", line 153, in <module> valueInputOption=value_input_opt

序言:Python非常新,但感谢您的帮助

下面是一段代码片段,我试图对MSSQL服务器表执行SQL查询,并将其发回GoogleSheets。我能够检索数据和标题,我想我几乎已经找到了答案。但是,我对某些列的datetime格式有一些问题。我收到的错误是:

Traceback (most recent call last):
  File "modelhome.py", line 153, in <module>
    valueInputOption=value_input_option, insertDataOption=insert_data_option, body=value_range_body)
  File "C:\ProgramData\Anaconda3\lib\site-packages\googleapiclient\discovery.py", line 785, in method
    actual_path_params, actual_query_params, body_value)
  File "C:\ProgramData\Anaconda3\lib\site-packages\googleapiclient\model.py", line 151, in request
    body_value = self.serialize(body_value)
  File "C:\ProgramData\Anaconda3\lib\site-packages\googleapiclient\model.py", line 260, in serialize
    return json.dumps(body_value)
  File "C:\ProgramData\Anaconda3\lib\json\__init__.py", line 231, in dumps
    return _default_encoder.encode(obj)
  File "C:\ProgramData\Anaconda3\lib\json\encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "C:\ProgramData\Anaconda3\lib\json\encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "C:\ProgramData\Anaconda3\lib\json\encoder.py", line 180, in default
    o.__class__.__name__)
TypeError: Object of type 'Timestamp' is not JSON serializable
dfData
中,普通字符串如下所示:

datettime条目如下所示:

我的理解是,JSON没有处理此数据类型的本机方法,必须将其作为异常处理。有没有一种方法可以序列化数据集的所有时间戳部分,而不必指定哪些列是datetime

如果您能提供任何帮助/建议,我们将不胜感激

谢谢

最终解决方案更新-信用:@chrisheinze

为datettime头添加以下dataframe建模非常有效

# Pandas reading values from SQL query, and building table
sqlData = pandas.read_sql_query(sql, cnxn)

# Pandas building dataframe, and exporting .xlsx copy of table
df = DataFrame(data=sqlData)

# Google Sheets API can't handle date/time. Below converts certain headers to formatted text strings.
df['Date'] = df['Date'].dt.strftime('%m/%d/%Y')
df['DateTime'] = df['DateTime'].dt.strftime('%m/%d/%Y %H:%M:%S')
df['RDD'] = df['RDD'].dt.strftime('%m/%d/%Y')
df['DateTimeErrorTable'] = df['DateTimeErrorTable'].dt.strftime('%m/%d/%Y %H:%M:%S')
df['DateTimeSuccessTable'] = df['DateTimeSuccessTable'].dt.strftime('%m/%d/%Y %H:%M:%S')
df['WorkedOn'] = df['WorkedOn'].dt.strftime('%m/%d/%Y %H:%M:%S')
df['EmailSentOn'] = df['EmailSentOn'].dt.strftime('%m/%d/%Y %H:%M:%S')

希望它能帮助别人

Sheets API不知道如何处理Python日期时间/时间戳。您需要将其转换为str

用于转换熊猫系列使用

如果只是一个需要转换的值,那么使用datetime的

编辑以回答评论中的问题:

# To convert a datetime column to a str. 

df['date_column'] = df['date_column'].dt.strftime('%Y%m%d%H%M%S')

为了提供更多信息,
strftime
的意思是“字符串格式的日期时间”。这允许您将日期时间/时间戳值格式化为str。
'%Y%m%d%H%m%S'
是您希望输出的内容。在我的示例中,您的约会结果为“20180309152303”。另一个例子是
“%m/%d/%Y%H:%m:%S”
,它将为您提供“03/09/2018 15:23:03”。因此,在我的示例中,将“date_column”替换为日期列的名称,它将被转换为一个str,该str与API兼容,并且在googlesheets中可以理解格式

如果无法分辨哪列是日期,请使用此功能:

import numpy as np

def cast_for_gsheets(df):
    # casting as string if not serializable
    for column, dt in zip(df.columns, df.dtypes):
        if dt.type not in [
            np.int64,
            np.float_,
            np.bool_,
        ]:
            df.loc[:, column] = df[column].astype(str)
    return df

df = cast_for_gsheets(DataFrame(data=sqlData))

嘿@Chrisheinze,谢谢你的回复!我想我理解你的意思,但我不知道如何将
dfData
df
、或
sqlData
传递到其中?变量会去哪里?@swolfe2我更新了我的答案,使之更深入一些。如果还不完全清楚,请告诉我!嘿@Chrisheinze,抱歉耽搁了你;你回答的时候我已经下班了。我是否需要为datetime的每一列单独写一行,或者是否有办法将多行放在其中?再次感谢!我得到了它!我已经用代码中的最终解决方案更新了OP,以防有人遇到同样的问题。谢谢我正在尝试将我的panda框架的日期/时间列添加到google工作表中。但它不喜欢它的任何方式,形状或形式。我序列化了,但它仍然不接受。它说它已经更新了,但在谷歌页面上仍然没有任何内容。有什么建议吗?我直接从json数据、列表和panda框架中进行了尝试,但没有成功
import numpy as np

def cast_for_gsheets(df):
    # casting as string if not serializable
    for column, dt in zip(df.columns, df.dtypes):
        if dt.type not in [
            np.int64,
            np.float_,
            np.bool_,
        ]:
            df.loc[:, column] = df[column].astype(str)
    return df

df = cast_for_gsheets(DataFrame(data=sqlData))