代码之家  ›  专栏  ›  技术社区  ›  Cedric Zoppolo

按datetime索引过滤pandas数据帧时的不同结果

  •  0
  • Cedric Zoppolo  · 技术社区  · 7 年前

    我正在尝试过滤 pandas 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]]
    

    :

    >>> 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
    

    问题:

    如何过滤真实数据,以获得与测试用例相同的结果? 有没有更好的方法来实现我的目标?

    :我的 0.9.0 python 2.5 . 意味着我没有 loc

    注释2 :我甚至用 python 2.7 pythonanywhere.com 结果相同但不同。但是如果我检查 df1==df2 我明白了 True

    1 回复  |  直到 7 年前
        1
  •  1
  •   chrisb    7 年前

    希望不用说,但如果可能的话,升级你的python/pandas!

    在这种情况下,在最新版本上( 0.20.3 )在这两种情况下,我都会丢失值-我需要将查找键转换为datetimes,我猜这也适用于您。

    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