Pandas报错处理:timedelta64[ns]与int类型无法比较问题求解
问题原因
报错的核心是maturite列为timedelta64[ns]时间差类型,无法直接和整数365做大小比较,也不能直接参与数值运算,需要先转换为对应的天数字段。同时你代码还存在两个隐藏问题:
Taux moyen pondéré字段当前为object类型,需要先转换为浮点型才能参与数值计算- 自定义函数
taux_act直接传入整列Series时,if m <365的逻辑无法直接作用于布尔数组,需要调整为逐行处理或者向量化运算逻辑
解决方案
步骤1:预处理字段类型
首先将时间差列转为天数值,同时转换利率字段为浮点型:
# 提取时间差的天数为整数列 df['maturite_days'] = df['maturite'].dt.days # 转换利率列为浮点型 df['Taux moyen pondéré'] = df['Taux moyen pondéré'].astype(float)
另外你原来的日期转换逻辑可以优化为Pandas内置方法,执行效率更高,还支持异常值处理:
df['Date de la valeur'] = pd.to_datetime(df['Date de la valeur'], format='%d/%m/%Y') df["Date d'échéance"] = pd.to_datetime(df["Date d'échéance"], format='%d/%m/%Y')
步骤2:实现利率计算逻辑
推荐使用向量化运算np.where,性能远高于逐行遍历:
import numpy as np df['taux'] = np.where( df['maturite_days'] < 365, ((1 + df['Taux moyen pondéré'] * df['maturite_days'])/360) ** (365/df['maturite_days']) - 1, df['Taux moyen pondéré'] )
如果习惯使用自定义函数,可以调整为逐行调用:
def taux_act(row): m = row['maturite_days'] t = row['Taux moyen pondéré'] if m < 365: return ((1 + t * m)/360) ** (365/m) - 1 else: return t df['taux'] = df.apply(taux_act, axis=1)
内容的提问来源于stack exchange,提问作者Dounia
相关产品推荐
相关产品推荐

