我有一个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
在索引类型方面遇到困难。
实际上,问题在于日期时间类型。所有代码均基于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
不能。
有谁遇到过同样的问题,并且知道为什么这两种方法的行为会有所不同吗?
谢谢
答案 0 :(得分:1)
医生说,pandas.DataFrame.at
中不存在标签时,KeyError
会引发DataFrame
。
当类型也不匹配时,也是如此。
似乎正在发生的事情是.at
在索引类型方面遇到困难。
import pandas as pd
from pandas.compat import StringIO
csvdata = StringIO("""date,OVER_price,DI1J95_price
1995-01-02,48.61,45.662
1995-01-03,50.12,45.542
2019-03-11,6.40,""")
# index is a string
df = pd.read_csv(csvdata, sep=",", index_col="date")
# string being used
print(df.at['1995-01-03', 'OVER_price'])
产生50.12
。
import pandas as pd
from pandas.compat import StringIO
csvdata = StringIO("""date,OVER_price,DI1J95_price
1995-01-02,48.61,45.662
1995-01-03,50.12,45.542
2019-03-11,6.40,""")
# index is going to be a datetime
df = pd.read_csv(csvdata, sep=",", index_col="date", parse_dates=True, infer_datetime_format=True)
# select with a datetime
from datetime import datetime as dt
print(df.at[dt(year=1995, month=1, day=3), 'OVER_price'])
产生50.12