【问题标题】:Using .loc on DatetimeIndex to retrieve a value on a specific date (KeyError在 DatetimeIndex 上使用 .loc 检索特定日期的值 (KeyError
【发布时间】:2021-01-14 09:59:20
【问题描述】:

我正在尝试在数据帧上使用 .loc 检索特定值。这曾经可以工作,但我已经升级到最新版本的 Pandas,它不再工作了。看看下面的示例数据和代码,有人知道这是怎么回事吗?

样本数据

            Open        High        Low         Close       Volume
Date                    
2020-09-24  2906.500000 2962.000000 2871.000000 2960.469971 6117900
2020-09-25  3033.840088 3133.989990 3000.199951 3128.989990 6948800

代码

import pandas as pd
from datetime import date, timedelta
import datetime

yesterday = date.today() - timedelta(3)
symbol_data.loc[yesterday]['Close']

过去它会检索值“3128.989990”,即 2020 年 9 月 25 日的收盘价。
现在我得到“KeyError: datetime.date(2020, 9, 25)”。

当我查看索引时,它显示 DatetimeIndex(['2020-09-24', '2020-09-25'], dtype='datetime64[ns]', name='Date', freq=None )

如果我传递字符串值,它会起作用。但我需要使用我的变量来计算日期。

symbol_data.loc['2020-09-25']['Close']  ##this works, but I don't want to use a hard coded date

【问题讨论】:

    标签: python pandas python-datetime


    【解决方案1】:

    与 Trenton 的建议类似,但与 normalize 链接以获取确切日期。另外,尽量避免索引链接

    yesterday = pd.Timestamp.now().normalize() - pd.Timedelta(days=3)
    df.loc[yesterday, 'Close']
    # out
    # 3128.98999
    

    【讨论】:

    • yesterday = (date.today() - timedelta(3)).isoformat()
    【解决方案2】:

    最近的 pandas 版本不允许 .loc.at 通过 python dattetime 对象进行切片。我被它击中了,所以我知道。您需要将其转换为 pandas Timestamp 或使用您已经发现的字符串。要将其包装到 pandas Timestamp,只需将变量传递给 pd.Timestamp

    In [44]: print(df.loc[pd.Timestamp(date.today() - timedelta(3)), 'Close'])
    

    输出:

    3128.98999
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多