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

pandas使用merge_asof合并时报M8[ns]与O类型不兼容错误如何解决

问题原因
  • 插入当前日期行时引入了Python原生datetime.date类型数据,导致原本为datetime64[ns]类型的date2列被自动降级为object类型,和右表stockPricesdf的date2列类型不匹配,触发类型校验报错
  • pd.merge_asof要求左右两个DataFrame的合并键(on参数指定的列)必须提前按升序排序,你的代码中未做排序处理,即使类型修复后也会触发排序相关报错
修正方案

对代码做三处调整即可解决问题:

  1. 插入当前行时统一使用pd.Timestamp类型,避免混入原生datetime对象污染列类型
  2. 插入完成后强制转换date2列为datetime64[ns]类型,确保左右表合并键类型一致
  3. 合并前分别对左右两个DataFrame按date2列升序排序,满足merge_asof的语法要求

修正后的完整代码如下:

import pandas as pd
import yfinance as yf
from datetime import date

def get_historical_pe(data, stock):
    item_data = {}
    for i,j in data['Earnings']['History'].items():
        item_data[j['date']]=[j['epsActual'], j['reportDate']]
    df = pd.DataFrame(item_data).T
    df.columns = ['EPS', 'Release date']
    df.dropna(subset=['EPS'], how='all', inplace=True)
    df.index = pd.to_datetime(df.index, format ='%Y-%m-%d')
    # 插入当前行时统一用pd.Timestamp,避免类型不一致
    today = pd.Timestamp(date.today())
    df.loc[today] = [df.loc[df.index.max(),'EPS'], 'TTM', today]
    # 统一转换date2列类型,确保全为datetime64[ns]
    df['date2'] = df.index.astype('datetime64[ns]')
    print(type(df['date2'][0]))
    
    stocksplit = stock.split('.')
    if stocksplit[1] == 'US':
        stockPricesdata = yf.Ticker(stocksplit[0])
    else:
        stockPricesdata = yf.Ticker(stock)
    stockPrices = stockPricesdata.history(period="max")['Close']
    stockPricesdf = pd.DataFrame(stockPrices)
    stockPricesdf['date2'] = stockPricesdf.index.astype('datetime64[ns]')
    
    # merge前分别对两个表按date2升序排序,满足merge_asof要求
    df = df.sort_values('date2')
    stockPricesdf = stockPricesdf.sort_values('date2')
    
    tol = pd.Timedelta('1 day')
    st = pd.merge_asof(
        left=df,
        right=stockPricesdf,
        on='date2',
        direction='nearest',
        tolerance=tol
        )
    
    return st

内容的提问来源于stack exchange,提问作者Ben2pop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 01:21:02