我在用pandas.DatetimeIndex索引索引熊猫数据帧时遇到麻烦。
当我尝试使用.loc
访问器为带有标签列表的数据帧建立索引时出现问题(相反,通过.iloc
的索引列表进行索引工作)。
以下是重现此问题的代码:
from __future__ import print_function
import sys
if sys.version_info[0] < 3:
from StringIO import StringIO
else:
from io import StringIO
import pandas as pd
import numpy as np
data = StringIO("""
timestamp,value
2014-04-02 14:29:00,42.652
2014-04-02 14:34:00,41.361
2014-04-02 14:39:00,-68.408
2014-04-02 14:44:00,40.262
2014-04-02 14:59:00,-89.836
2014-04-02 15:04:00,42.579
""")
anomalies = ['2014-04-02 14:39:00', '2014-04-02 14:59:00']
df = pd.read_csv(data, parse_dates=['timestamp'], index_col='timestamp')
# Works
print("1)")
print(df.loc[anomalies[0]])
print(df.loc[anomalies[1]])
# Works
print("\n2)")
anomalies_indexes = [np.argwhere(df.index == a).item() for a in anomalies]
print(anomalies_indexes) # prints [2, 4]
print(df.iloc[anomalies_indexes, :])
# Does not work -> throws KeyError
print("\n3)")
print(df.loc[anomalies, :])
我在计算机上使用的是Python 3.7.2
和熊猫0.23.4
,但是在使用Python 3.7.4
和pandas 0.25.1
的Repl.it上也会发生相同的行为(尝试{ {3}}和Python 2.7.16
和熊猫0.24.2
(尝试使用Repl.it),这是撰写本文时Repl.it上Python 2和3环境的默认版本。
您能在我的代码中发现任何错误或告诉我我缺少什么吗?
[编辑:答案]
解决方案是按照注释中的建议转换日期时间对象中的字符串(感谢用户@ anky_91):
anomalies = [pd.to_datetime(a) for a in anomalies]
print(df.loc[anomalies, :]) # Now this works