熊猫数据帧上的切片行为[:]不一致

Sas*_*ank 1 python pandas

我有2个数据框。第一个数据帧具有数字作为索引。第二个数据帧具有日期时间作为索引。切片运算符(:)在这些数据帧上的行为不同。

情况1

>>> df = pd.DataFrame({'A':[1,2,3]}, index=[0,1,2])
>>> df
   A
0  1
1  2
2  3
>>> df [0:2]
   A
0  1
1  2
Run Code Online (Sandbox Code Playgroud)

情况二

>>> a = dt.datetime(2000,1,1)
>>> b = dt.datetime(2000,1,2)
>>> c = dt.datetime(2000,1,3)
>>> df = pd.DataFrame({'A':[1,2,3]}, index = [a,b,c])
>>> df
            A
2000-01-01  1
2000-01-02  2
2000-01-03  3
>>> df[a:b]
            A
2000-01-01  1
2000-01-02  2
Run Code Online (Sandbox Code Playgroud)

为什么在情况1中排除了最后一行,而在情况2中却排除了呢?

jez*_*ael 5

不要使用它,更好的是loc用于一致性:

df = pd.DataFrame({'A':[1,2,3]}, index=[0,1,2])

print (df.loc[0:2])
   A
0  1
1  2
2  3

a = datetime.datetime(2000,1,1)
b = datetime.datetime(2000,1,2)
c = datetime.datetime(2000,1,3)
df = pd.DataFrame({'A':[1,2,3]}, index = [a,b,c])

print (df.loc[a:b])
            A
2000-01-01  1
2000-01-02  2
Run Code Online (Sandbox Code Playgroud)

原因,为什么省略最后一行可以在docs中找到:

使用DataFrame,在[]内切片将对行进行切片。由于这是一种常见的操作,因此很大程度上是为了方便而提供。

print (df[0:2])
   A
0  1
1  2
Run Code Online (Sandbox Code Playgroud)

为了按日期时间进行选择,使用了精确的索引

...相反,使用Timestamp或datetime对象建立索引是准确的,因为这些对象具有确切的含义。这些还遵循包括两个端点的语义