swo*_*fe2 3 python pyodbc pandas google-api-python-client google-sheets-api
前言:Python 非常新,但感谢您的帮助!
下面是一个代码片段,我试图在其中对 MSSQL 服务器表执行 SQL 查询,然后将其发回 Google 表格。我能够检索数据和标题,我想我几乎已经弄清楚了。但是,我在使用某些列的日期时间格式时遇到了一些麻烦。我收到的错误是:
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
Run Code Online (Sandbox Code Playgroud)
代码片段
"""Execute SQL Statement, create table, and append back to Google Sheet"""
# SQL Server Connection
server = '[SQLServerIP]'
database = '[SQLServerDatabase]'
username = '[SQLServerUsername]'
password = '[SQLServerPassword]'
cnxn = pyodbc.connect('Driver={ODBC Driver 13 for SQL Server};SERVER=' +
server+';DATABASE='+database+';UID='+username+';PWD='+password)
# Sample SQL Query to get Data
sql = 'select * from tblName'
cursor = cnxn.cursor()
cursor.execute(sql)
list(cursor.fetchall())
# 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)
df.to_excel('tblName.xlsx',
header=True, index=False)
dfHeaders = df.columns.values.tolist()
dfHeadersArray = [dfHeaders]
dfData = df.values.tolist()
dfDataFormatted = [dfData]
"""Writing to Google Sheet Range"""
print(dfHeaders)
print(dfData)
# How the input data should be interpreted.
value_input_option = 'USER_ENTERED' # TODO: Update placeholder value.
# How the input data should be inserted.
insert_data_option = 'OVERWRITE' # TODO: Update placeholder value.
value_range_body = {
"majorDimension": "ROWS",
"values":
dfHeadersArray + dfDataFormatted
}
request = service.spreadsheets().values().append(spreadsheetId=spreadsheetId, range=SQLRangeName,
valueInputOption=value_input_option, insertDataOption=insert_data_option, body=value_range_body)
response = request.execute()
Run Code Online (Sandbox Code Playgroud)
我的理解是 JSON 没有处理这种数据类型的本机方式,它必须作为异常处理。有没有办法序列化数据集的所有时间戳部分而不必指定哪些列是日期时间?
您可以提供的任何帮助/建议将不胜感激。
谢谢!
最终解决方案更新 - 信用:@chrisheinze
为 datettime 标头添加以下数据帧建模效果很好。
# 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')
Run Code Online (Sandbox Code Playgroud)
希望它可以帮助别人!
Sheets API 不知道如何处理 Python 日期时间/时间戳。您需要将其转换 - 最有可能转换为 str。
用于转换熊猫系列使用 pd.Series.dt.strftime()
如果它只是用于需要转换的单个值,则使用日期时间 strftime()
编辑以在评论中回答您的问题:
# To convert a datetime column to a str.
df['date_column'] = df['date_column'].dt.strftime('%Y%m%d%H%M%S')
Run Code Online (Sandbox Code Playgroud)
提供更多信息,strftime表示“字符串格式日期时间”。这允许您将日期时间/时间戳值格式化为 str。这'%Y%m%d%H%M%S'就是你想要的输出。在我的示例中,您的日期的结果将是“20180309152303”。另一个例子是'%m/%d/%Y %H:%M:%S'它会给你“03/09/2018 15:23:03”。因此,在我的示例中将 'date_column' 替换为您的日期列的名称,它将被转换为与 API 兼容的 str 以及在 Google Sheets 中理解的格式。
| 归档时间: |
|
| 查看次数: |
4906 次 |
| 最近记录: |