无法使用日期作为字符串对pandas数据帧(以日期为键)进行切片

mpn*_*ny1 5 python dataframe pandas datetimeindex

我正在生成一个空数据框,其中包含一系列日期作为索引.数据将在稍后添加到数据框中.

cbd=pd.date_range(start=pd.datetime(2017,01,02),end=pd.datetime(2017,01,30),period=1)

df = pd.DataFrame(data=None,columns=['Test1','Test2'],index=cbd)

df.head()
           Test1 Test2
2017-01-02   NaN   NaN
2017-01-03   NaN   NaN
2017-01-04   NaN   NaN
2017-01-05   NaN   NaN
2017-01-06   NaN   NaN
Run Code Online (Sandbox Code Playgroud)

一些切片方法似乎不起作用.以下返回KeyError:

df['2017-01-02']
Run Code Online (Sandbox Code Playgroud)

但是,以下任何工作:

df['2017-01-02':'2017-01-02']
df.loc['2017-01-02']
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?为什么第一个切片不返回结果?

MYG*_*YGz 13

双重行为[]df[]

  • 当您不使用:inside时[],其中的值将被视为列.
  • 当你:在里面使用时,它里面[]的值将被视为行.

为什么双重性?

因为大多数时候人们想要切片而不是切片.因此,他们决定x,ydf[x:y]应该对应行xd[x]或者x,ydf[[x,y]]应该对应于列(S).

例:

df = pd.DataFrame(data = [[1,2,3], [1,2,3], [1,2,3]],
                                 index = ['A','B','C'], columns = ['A','B','C'])
print df
Run Code Online (Sandbox Code Playgroud)

输出:

   A  B  C
A  1  2  3
B  1  2  3
C  1  2  3
Run Code Online (Sandbox Code Playgroud)

现在,当你这样做时df['B'],它可能意味着两件事:

因此,为了解决这个冲突并保持明确无误df['B']将永远意味着你想要列'B',如果没有这样的列,那么它将抛出一个错误.

为什么df['2017-01-02']失败?

它将搜索一列'2017-01-02',因为没有这样的列,它会抛出一个错误.

df.loc['2017-01-02']那么为什么会有效呢?

因为.loc[]有语法,df.loc[row,column]如果你愿意,可以省略列,就像你的情况一样,它只是意味着df.loc[row]

  • 我希望我可以一百次回答这个问题. (2认同)