You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将Python DataFrame导入MySQL:timestamp类型转换错误求助

解决Python Timestamp无法转换为MySQL类型的问题

错误原因确实是你猜测的Python与MySQL时间类型不兼容:pandas返回的Timestamp类型无法被mysql-connector直接解析为MySQL支持的时间类型(DATE/DATETIME),需要先转换为MySQL可识别的格式。

具体修复步骤:

  1. 转换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')
  2. 优化数据库连接(可选但推荐)
    不要在循环里重复创建数据库连接,把连接逻辑移到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 09:58:13