pandas使用merge_asof合并时报M8[ns]与O类型不兼容错误如何解决
问题原因
- 插入当前日期行时引入了Python原生
datetime.date类型数据,导致原本为datetime64[ns]类型的date2列被自动降级为object类型,和右表stockPricesdf的date2列类型不匹配,触发类型校验报错 pd.merge_asof要求左右两个DataFrame的合并键(on参数指定的列)必须提前按升序排序,你的代码中未做排序处理,即使类型修复后也会触发排序相关报错
修正方案
对代码做三处调整即可解决问题:
- 插入当前行时统一使用
pd.Timestamp类型,避免混入原生datetime对象污染列类型 - 插入完成后强制转换
date2列为datetime64[ns]类型,确保左右表合并键类型一致 - 合并前分别对左右两个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
相关产品推荐
相关产品推荐

