将timedelta转换为整数做运算时出现numpy报错该如何解决?
报错核心原因
触发报错的本质是运算时的操作数类型不兼容:
- 代码中计算得到的
new_date是Python标准库datetime模块原生的timedelta对象,numpy无法识别其为原生时间差类型,会将其归类为通用对象类型(即报错信息里的dtype('O')) - 作为除数的
np.timedelta64(1, 'D')是numpy原生的天级时间差类型(即报错信息里的dtype('<m8[D]'))
两类类型无法匹配numpy真除法的运算逻辑,因此抛出二进制运算解析错误。
修复实现方案
方案1:纯Python原生实现(无numpy依赖,稳定性最高)
原生timedelta对象本身就内置了时间差的数值计算能力,完全不需要和numpy类型做交互:from datetime import datetime zeit = datetime(2023, 1, 1) today = datetime.now() new_date = zeit - today # 直接取整的天数(自动忽略不足1天的时长) days_int = new_date.days # 如果需要先计算带小数的精确天数、再取整 days_int = int(new_date.total_seconds() / 86400)方案2:适配numpy运算流程的实现
如果后续业务必须基于numpy完成数值计算,需要先将原生timedelta转换为numpy原生的时间差类型,再做除法运算:import numpy as np from datetime import datetime zeit = datetime(2023, 1, 1) today = datetime.now() new_date = zeit - today # 先完成类型转换,再做除法取整 days_int = (np.timedelta64(new_date, 'D') / np.timedelta64(1, 'D')).astype(int)原代码的逻辑缺陷就是没有做这一步类型转换,直接将原生timedelta传入numpy的除法运算,才触发了dtype不匹配的问题。
内容的提问来源于stack exchange,提问作者Nico Pérez
相关产品推荐
相关产品推荐

