无法将Python DataFrame导入MySQL:timestamp类型转换错误求助
解决Python Timestamp无法转换为MySQL类型的问题
错误原因确实是你猜测的Python与MySQL时间类型不兼容:pandas返回的Timestamp类型无法被mysql-connector直接解析为MySQL支持的时间类型(DATE/DATETIME),需要先转换为MySQL可识别的格式。
具体修复步骤:
转换DataFrame中的时间列类型
将DataFrame里的时间列(假设列名为date,请根据实际列名修改)转换为Python原生的datetime.date对象,或者格式化的日期字符串:- 转成
date对象:new_record['date'] = new_record['date'].dt.date - 转成字符串:
new_record['date'] = new_record['date'].dt.strftime('%Y-%m-%d')
- 转成
优化数据库连接(可选但推荐)
不要在循环里重复创建数据库连接,把连接逻辑移到ticker循环外,避免频繁建立/断开连接。
修改后的完整代码:
import pandas as pd from datetime import date import mysql.connector from mysql.connector import Error def priceStock(tickers): today = pd.to_datetime("today").strftime("%Y-%m-%d") # 把数据库连接移到循环外 try: conn = mysql.connector.connect( host='103.200.22.212', database='analysis_stock', user='analysis_PhamThiLinhChi', password='Phamthilinhchi' ) cursor = conn.cursor() table = 'priceStock' for ticker in tickers: new_record = stock_historical_data(ticker, '2018-01-01', today) new_record.insert(0, 'ticker', ticker) # 转换时间列类型(根据实际列名修改) new_record['date'] = new_record['date'].dt.date # 逐行插入(数据量大时建议用批量插入) for _, row in new_record.iterrows(): sql = f"INSERT INTO {table} VALUES (%s,%s,%s,%s,%s,%s,%s)" cursor.execute(sql, tuple(row)) print(f"Record inserted for {ticker}") conn.commit() except Error as e: print(f"数据库操作错误: {e}") finally: # 确保关闭连接 if conn.is_connected(): cursor.close() conn.close() priceStock(['VIC'])
额外注意事项:
- 确认MySQL表
priceStock的时间列类型:- 如果是
DATE类型,用datetime.date对象或%Y-%m-%d字符串都可以; - 如果是
DATETIME类型,则需要转成datetime.datetime对象或%Y-%m-%d %H:%M:%S格式的字符串。
- 如果是
- 数据量大时,推荐用
executemany批量插入,比逐行execute效率高得多:sql = f"INSERT INTO {table} VALUES (%s,%s,%s,%s,%s,%s,%s)" # 把DataFrame转成元组列表 data_tuples = [tuple(row) for _, row in new_record.iterrows()] cursor.executemany(sql, data_tuples) conn.commit()
内容的提问来源于stack exchange,提问作者Linh Chi
相关产品推荐
相关产品推荐

