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
相关产品推荐
相关产品推荐

