【问题标题】:Error in Loop: "Cannot unpack non-iterable Timedelta object"循环错误:“无法解压不可迭代的 Timedelta 对象”
【发布时间】:2022-11-15 19:34:25
【问题描述】:

我正在学习 Python,我正在尝试创建一个简单的循环,以将脏价格添加到我的数据框 bond_df 中。

Days_left 是一个系列,bond_df 是一个熊猫数据框,其中包含以下公式中使用的收盘价。

如果我运行命令:

days = days_left[1].days

我得到一个大小为 1、值为 2 的整数,这正是我所需要的。我需要天数作为整数,并且上面没有任何其他时间戳(见附图)。所以,我使用“.days”,这样我就可以提取天的整数值,并去掉小时和秒等的时间戳。

因此,我想我可以在循环中使用它来构建我的 dirty-prices 列,在我的 df 中:

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:无法解压不可迭代的 Timedelta 对象”

然后我想,我可以使用范围来构造一个循环:

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'])

这似乎按预期工作。

但我仍然想知道,我一开始做错了什么。

有人可以解释这两个循环之间的区别以及为什么我不能像上面那样做吗?

一切顺利,网卡

【问题讨论】:

  • 注意:您可以使用三重 ``` 栅栏或缩进来格式化代码块。试图在一行上弄脏它会使其不可读。

标签: python pandas for-loop datetime timedelta


【解决方案1】:

这里:

for i, number in days_left:

你的意思是

for i, number in enumerate(days_left):

最有可能的...

【讨论】:

    【解决方案2】:

    您可以使用 pandas 矢量化功能来简化:

    import pandas as pd
    
    DAYS_IN_YEAR = 365 # this actually isn't constant; adjust as needed
    
    df = pd.DataFrame(
        {
            "days_left": [pd.Timedelta(days=1), pd.Timedelta(days=2), pd.Timedelta(days=3)],
            "closing_price": [1, 2, 3],
        }
    )
    
    df["dirty_price"] = df["closing_price"] + (
        (DAYS_IN_YEAR - df["days_left"].dt.total_seconds() / 86400)
        / DAYS_IN_YEAR
        # could also use df["days_left"].dt.days here if hours minutes etc. don't matter
    )
    
    df
      days_left  closing_price  dirty_price
    0    1 days              1     1.997260
    1    2 days              2     2.994521
    2    3 days              3     3.991781
    

    【讨论】:

      猜你喜欢
      • 2020-01-28
      • 2019-04-22
      • 1970-01-01
      • 2020-07-12
      • 2020-07-21
      • 2020-04-08
      • 2021-07-10
      • 2021-05-25
      • 1970-01-01
      相关资源
      最近更新 更多