Python 使用带列表和范围的.ix索引时出现意外结果

Python 使用带列表和范围的.ix索引时出现意外结果,python,pandas,Python,Pandas,有人能给我解释一下这种行为吗 import pandas as pd dates = pd.date_range('1/1/2000', periods=8) df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D']) df.ix['2000-01-01':'2000-01-02', ['A', 'C']] ## Output: A

有人能给我解释一下这种行为吗

import pandas as pd

dates = pd.date_range('1/1/2000', periods=8)
df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])

df.ix['2000-01-01':'2000-01-02', ['A', 'C']]

## Output:
                   A         C
2000-01-01  0.224944 -0.689382
2000-01-02 -0.824735 -0.805512

df.ix[['2000-01-01', '2000-01-02'], ['A', 'C']]

## Output:
             A   C
2000-01-01 NaN NaN
2000-01-02 NaN NaN
我希望两个索引操作都返回相同的(第一个)结果

然后我有点明白了:

from datetime import datetime

df.loc[[datetime(2000, 1, 1), datetime(2000, 1, 5)], ['A','C']]

## Output
                   A         C
2000-01-01  0.224944 -0.689382
2000-01-05 -0.393747  0.462126
现在,我不知道pandas的内部结构,也不知道为什么它在给定一个范围时隐式地将字符串转换为日期,但在给定一个列表时却不会,但我的猜测是,范围清楚地表明,我们指的是一个具有序号性质的对象,所以pandas可能会检查索引,看到它是一个日期时间,然后将字符串解析为日期

但问题是,当我们提供单个字符串时,为什么它做了正确的事情

df.loc['2000-01-01', ['A','C']]

## Output:
A    0.224944
C   -0.689382
Name: 2000-01-01 00:00:00, dtype: float64

当给定一个列表时,不尝试转换多个值是否是一个性能问题?其他一些设计决策?

使用字符串访问DatetimeIndex有点被侵入(因为R会这样做,所以它就在那里,但很容易找到像这样的边缘案例)。也就是说:

  • 它适用于切片
  • 它适用于单一访问
  • 它可能适用于其他一些情况,但我不会指望它

使用时间戳比使用字符串要好得多:

In [11]: df.ix[pd.Timestamp('2000-01-01'), ['A','C']]
Out[11]:
A    0.480959
C    0.468689
Name: 2000-01-01 00:00:00, dtype: float64

In [12]: df.ix[pd.Timestamp('2000-01-01'):pd.Timestamp('2000-01-02'), ['A','C']]
Out[12]:
                   A         C
2000-01-01  0.480959  0.468689
2000-01-02 -0.971965 -0.840954

In [13]: df.ix[[pd.Timestamp('2000-01-01'), pd.Timestamp('2000-01-02')], ['A', 'C']]
Out[13]:
                   A         C
2000-01-01  0.480959  0.468689
2000-01-02 -0.971965 -0.840954

In [14]: df.ix[pd.to_datetime(['2000-01-01', '2000-01-02']), ['A', 'C']]
Out[14]:
                   A         C
2000-01-01  0.480959  0.468689
2000-01-02 -0.971965 -0.840954

正如您在回答中提到的,这比
.loc
更清晰(尽管在本例中没有歧义),而不是
.ix

更容易说明意外行为:
df.ix[['2000-01-01',2000-01-02']
--NaNs@shx2确切地正如你所指出的,它用一个日期字符串做正确的事情。我很确定这是一个已知的错误。。。但没有人想实现它(或者至少没有人想实现)。编辑:我在github上找不到它。。。但我想它就在那里的某个地方。