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

Python循环报错:Cannot unpack non-iterable Timedelta object问题解析

Pandas循环报错原因与两种循环差异解析

我正在学习Python,尝试通过循环为Pandas DataFrame bond_df 添加dirty_price列。其中days_left是Timedelta类型的Series,单独执行days = days_left[1].days能提取出整数天数(比如2)。

出错的循环代码

for i, number in days_left:
    days = days_left[i].days
    bond_df['dirty_price'][i] = bond_df['closing_price'][i] + ((365 - days)/365)

执行后报错:

TypeError: cannot unpack non-iterable Timedelta object

正常运行的循环代码

for i in range(0, len(days_left)):
    days = days_left[i].days
    bond_df['dirty_price'][i] = bond_df['closing_price'][i] + ((365 - days)/365)
    print(days, bond_df['dirty_price'])

两种循环的核心差异

  • 第一种循环直接遍历Series days_left:Pandas Series默认遍历的是元素本身,而非索引+元素的键值对。这里每个元素是Timedelta对象,无法拆成两个变量。
  • 第二种循环遍历索引序列:通过range(len(days_left))生成所有元素的索引,再用索引去days_left和bond_df中定位取值,逻辑是通过索引访问元素,不存在解包问题。

第一种循环报错的原因

写for i, number in days_left:时,Python会尝试把每个迭代对象拆成两个值赋值给i和number,但days_left的元素是不可迭代的Timedelta对象,无法被拆分成两部分,因此抛出解包错误。

如果想实现索引+元素的遍历,正确写法是用Series的.items()方法,每次迭代返回(索引, 元素值)的元组:

for i, timedelta_val in days_left.items():
    days = timedelta_val.days
    bond_df['dirty_price'][i] = bond_df['closing_price'][i] + ((365 - days)/365)

额外优化建议

Pandas中逐行循环性能极低,更推荐矢量化操作,一行代码就能完成计算:

bond_df['dirty_price'] = bond_df['closing_price'] + ((365 - days_left.days)/365)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:20:28