按datetime索引筛选数据帧时的不同结果

2024-09-28 23:29:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图过滤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]]

我得到以下值为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版本是在python 2.5下使用的0.9.0。意思是我没有loc函数。你知道吗

注2:我甚至用pythonanywhere.com下的python 2.7尝试了这个方法,得到了同样不同的结果。但是,如果我检查df1==df2,我会得到每个值的True。你知道吗


Tags: columns数据dataframepandas测试用例nanfilteredpd
1条回答
网友
1楼 · 发布于 2024-09-28 23:29:25

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

在本例中,在最新版本(0.20.3)中,这两种情况下都会出现缺失值—我需要将查找键转换为datetime,我猜这也适用于您。你知道吗

方便的基于字符串的日期索引只适用于标量/切片。你知道吗

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

相关问题 更多 >