索引的奇怪行为

时间:2013-07-22 18:14:30

标签: pandas

我有一个大型DataFrame,由以下类型的日期时间索引

2013-07-15 09:30:00.073000,-0.909437,0.287493,-0.071288

当我尝试以下代码时,我得到一个结果

tempdf[tempdf.index[1]:tempdf.index[2]]

但是当我尝试

tempdf[tempdf.index[2]]

我收到以下错误

KeyError: u'no item named 2013-07-15 09:30:00.076000'

实际上,以下类型的代码也会出错。

tempdf[tempdf.index[3]:tempdf.index[8]]

1 个答案:

答案 0 :(得分:2)

您正在使用不适用的索引快捷方式,请参阅此处:http://pandas.pydata.org/pandas-docs/dev/timeseries.html#datetime-indexing

创建时间索引框架

In [7]: df = DataFrame(randn(10,2),columns=list('AB'),index=date_range('20130101',periods=10))

In [8]: df
Out[8]: 
                   A         B
2013-01-01 -1.423000  0.455915
2013-01-02 -0.665164 -0.057901
2013-01-03  2.446799 -1.788711
2013-01-04  0.054663  0.254730
2013-01-05 -0.371827 -0.775781
2013-01-06  0.275138 -1.221521
2013-01-07  1.338971  0.652810
2013-01-08  0.454797 -0.966469
2013-01-09  0.942590  0.302687
2013-01-10 -0.587606 -0.562724

这是切片在行

上选择的便利
In [9]: df[df.index[1]:df.index[2]]
Out[9]: 
                   A         B
2013-01-02 -0.665164 -0.057901
2013-01-03  2.446799 -1.788711

这会给你一个错误,因为它寻找一个列(你传递了一个值)

In [10]: df[df.index[2]]
KeyError: u'no item named 2013-01-03 00:00:00'

这是选择没有歧义的方法

从行

中选择一个项目
In [11]: df.loc[df.index[2]]
Out[11]: 
A    2.446799
B   -1.788711
Name: 2013-01-03 00:00:00, dtype: float64

从行

中选择一个范围
In [12]: df.loc[df.index[2]:df.index[3]]
Out[12]: 
                   A         B
2013-01-03  2.446799 -1.788711
2013-01-04  0.054663  0.254730

从列中选择

In [13]: df.loc[:,'A']
Out[13]: 
2013-01-01   -1.423000
2013-01-02   -0.665164
2013-01-03    2.446799
2013-01-04    0.054663
2013-01-05   -0.371827
2013-01-06    0.275138
2013-01-07    1.338971
2013-01-08    0.454797
2013-01-09    0.942590
2013-01-10   -0.587606
Freq: D, Name: A, dtype: float64

如果wes重新做了这件事,我认为这个API不会被允许......但是太根深蒂固了 []选择是WAY重载,pandas尽力找出你想要的东西