你是对的,这应该是访问一行的明显方式,但 MultiIndex 的日期时间部分似乎存在问题(我认为这是一个错误,因为它仅适用于三个级别中的两个级别,但不适用于三个级别.并且当日期时间是唯一的索引时它也有效)。
作为一种解决方法,您可以使用明确的 pandas Timestamp 而不是字符串,这样可以:
>>> df= pd.DataFrame({'ACCOUNT':["ACCT1", "ACCT1", "ACCT1", "ACCT2"],
... 'TICKER':["ABC", "MNP", "XYZ", "XYZ"],
... 'val':[1,2,3,4]},
... index=pd.date_range("2013-06-19 09:30:00", periods=4, freq='5T'))
>>> df = df.set_index(['ACCOUNT', 'TICKER'], append=True)
>>>
>>> df.loc[(pd.Timestamp('2013-06-19 09:30:00'), 'ACCT1', 'ABC')]
val 1
Name: (2013-06-19 09:30:00, ACCT1, ABC), dtype: int64
正如您所报告的那样,使用字符串时却没有:
>>> df.loc[('2013-06-19 09:30:00', 'ACCT1', 'ABC')]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 697, in __getitem__
return self._getitem_tuple(key)
File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 258, in _getitem_tuple
self._has_valid_tuple(tup)
File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 692, in _has_valid_tuple
if not self._has_valid_type(k,i):
File "C:\Anaconda\lib\site-packages\pandas\core\indexing.py", line 767, in _has_valid_type
raise KeyError("the label [%s] is not in the [%s]" % (key,self.obj._get_axis_name(axis)))
KeyError: 'the label [ACCT1] is not in the [columns]'
>>> df.loc[(pd.Timestamp('2013-06-19 09:30:00', tz=None), 'ACCT1', 'ABC')]
val 1
Name: (2013-06-19 09:30:00, ACCT1, ABC), dtype: int64