У меня есть датафрейм Pandas, который содержит некоторые даты и цены.
Мой индекс содержит даты (приписанные df.set_index) и столбцы различных активов.
Это выглядит примерно так, но это [6069 строк x 306 столбцов]
OVER_price DI1J95_price
1995-01-02 48.61 45.662
1995-01-03 50.12 45.542
2019-03-11 6.40 NaN
У меня есть класс, который принимает в качестве параметров calcDate, который является датой индекса, diCode, который является именем актива в столбцах, и diPanel, который является моим dataFrame.
Если я бегу в своем классе df.loc:
#Find Prices
self.diPrice = diPanel.loc[self.calcDate, self.diCode]
Я получаю ожидаемую цену, без проблем.
Если я изменю код на df.at:
#Find Prices
self.diPrice = diPanel.at[self.calcDate, self.diCode]
Я получил исключение KeyError. Например, 2019-03-11, когда calcDate возвращает:
Исключение: KeyError
17966
Есть какие-нибудь подсказки о том, что происходит?
Спасибо
На основании Рич Эндрюс 'ответ:
Похоже, что .at
испытывает трудности с типом индекса.
На самом деле проблема в типе datetime. Код Allmy основан на типе numpy.datetime64[D]
. Однако индекс моего DataFrame равен pandas.Timestamp
.
Я смог дважды проверить, что работает:
# Print last Index value and Type
print(type(diPanel.index[6068]))
print(diPanel.index[6068])
Возвращает:
2019-03-11 00:00:00
<class 'pandas._libs.tslibs.timestamps.Timestamp'>
И для моего аргумента поиска:
# Print last Index value and Type
print(type(self.calcDate))
print(self.calcDate)
Возвращает:
<class 'numpy.datetime64'>
2019-03-11
По какой-то причине .loc
может обойти несоответствие типов, а .at
- нет.
Кто-нибудь имел такую же проблему и знает, почему эти два метода ведут себя по-разному?
Спасибо