按日期时间索引过滤 pandas DataFrame 时的不同结果

Different results while filtering pandas DataFrame by its datetime index

我正在尝试过滤 pandas DataFrame,但我使用测试用例和真实数据得到了不同的结果。使用真实数据,我得到了 NaN 值,而在测试用例中,我得到了我期望的值。

测试用例:

我创建的测试用例有以下代码:

import pandas as pd
df1 = pd.DataFrame([
["2014-08-06 12:10:00", 19.85,  299.96, 17.5,   228.5,  19.63,  571.43],
["2014-08-06 12:20:00", 19.85,  311.55, 17.85,  248.68, 19.78,  547.21],
["2014-08-06 12:30:00", 20.06,  355.27, 18.35,  224.82, 19.99,  410.68],
["2014-08-06 12:40:00", 20.14,  405.95, 18.49,  247.33, 20.5,   552.79],
["2014-08-06 12:50:00", 20.14,  352.87, 18.7,   449.33, 20.86,  616.44],
["2014-08-06 13:00:00", 20.28,  356.96, 18.92,  307.57, 21.15,  471.18]],
columns=["date_time","t1", "1", "t4", "4", "t6", "6"])
df1 = df1.set_index(["date_time"])
df1 = pd.to_datetime(df1)

filter1 = pd.DataFrame(["2014-08-06 12:20:00","2014-08-06 13:00:00"])
df1_filtered = df1.ix[filter1[filter1.columns[0]][0:2]]

如您所料,结果是:

>>> df1_filtered
                        t1       1     t4       4     t6       6
2014-08-06 12:20:00  19.85  311.55  17.85  248.68  19.78  547.21
2014-08-06 13:00:00  20.28  356.96  18.92  307.57  21.15  471.18

使用真实数据:

Real data 来自一个 txt 文件,看起来像这样:

Fecha_hora  t1  1   t4  4   t6  6
2014-08-06 12:10:00 19.85   299.96  17.5    228.5   19.63   571.43
2014-08-06 12:20:00 19.85   311.55  17.85   248.68  19.78   547.21
2014-08-06 12:30:00 20.06   355.27  18.35   224.82  19.99   410.68
2014-08-06 12:40:00 20.14   405.95  18.49   247.33  20.5    552.79
2014-08-06 12:50:00 20.14   352.87  18.7    449.33  20.86   616.44
2014-08-06 13:00:00 20.28   356.96  18.92   307.57  21.15   471.18

然而,当我读取真实数据,并以这种方式使用与以前相同的过滤器时:

df2 = pd.read_csv(r"D:/tmp/data.txt", sep='\t', parse_dates=True, index_col=0)
df2_filtered = df2.ix[filter1[filter1.columns[0]][0:2]]

我得到以下结果,值为 NaN:

>>> df2_filtered
                     t1   1  t4   4  t6   6
2014-08-06 12:20:00 NaN NaN NaN NaN NaN NaN
2014-08-06 13:00:00 NaN NaN NaN NaN NaN NaN

但我仍然可以像这样从某一行获取值:

>>> df2.ix["2014-08-06 12:20:00"]
t1     19.85
1     311.55
t4     17.85
4     248.68
t6     19.78
6     547.21
Name: 2014-08-06 12:20:00

问题:

如何过滤我的真实数据以获得与我的测试用例相同的结果?是否有更好的方法来实现我正在寻找的东西?

注意:我的pandas版本是0.9.0python 2.5下使用的。表示我没有 loc 功能。

注 2:我什至在 pythonanywhere.com 下使用 python 2.7 尝试过此操作,但结果相同。但是,如果我检查 df1==df2,我会得到每个值的 True

希望不言而喻,但如果可能的话,请升级您的 python/pandas!

在这种情况下,在最新版本 (0.20.3) 中,我在这两种情况下都缺少值 - 我需要将查找键转换为日期时间,我猜它也适用于您。

方便的基于字符串的日期索引仅适用于标量/切片。

In [174]: lookup = pd.to_datetime(filter1[filter1.columns[0]][0:2])

In [175]: df2.ix[lookup]
Out[175]: 
                        t1       1     t4       4     t6       6
Fecha_hora                                                      
2014-08-06 12:20:00  19.85  311.55  17.85  248.68  19.78  547.21
2014-08-06 13:00:00  20.28  356.96  18.92  307.57  21.15  471.18