按日期时间索引过滤 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.0
在python 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
我正在尝试过滤 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.0
在python 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