我有以下数据框:
DateTime Seq
timestamp
1475504294990,10/03/2016 10:18:14:990000,2123847
1475504446660,10/03/2016 10:20:46:660000,2123908
1475504524410,10/03/2016 10:22:04:410000,2123953
1475504848100,10/03/2016 10:27:28:100000,2124067
1475504940530,10/03/2016 10:29:00:530000,2124126
我想使用开始和结束时间邮票将此数据帧切成薄片
start = 1475504446660
end = 1475504848100
print df[start:end]
DateTime Seq
timestamp
1475504446660,10/03/2016 10:20:46:660000,2123908
1475504524410,10/03/2016 10:22:04:410000,2123953
1475504848100,10/03/2016 10:27:28:100000,2124067
但是,我遇到了这个错误:
IndexError: failed to coerce slice entry of type long to integer
我尝试使用df [int(start):int(end)],仍然遇到相同的错误
要切片,您必须将时间戳定义为索引,并使用loc
执行标签索引(否则它在整体索引的位置和标签索引之间都模棱两可)。
df = df.set_index('timestamp')
df.loc[start:end]
# DateTime Seq
# timestamp
# 1475504446660 10/03/2016 10:20:46:660000 2123908
# 1475504524410 10/03/2016 10:22:04:410000 2123953
# 1475504848100 10/03/2016 10:27:28:100000 2124067
默认情况下,在integer
索引的情况下,索引是按位置进行的,而不是由标签进行的,请参见此示例中的结果。
df[0:2] # equivalent to df.iloc[0:2]
# DateTime Seq
# timestamp
# 1475504294990 10/03/2016 10:18:14:990000 2123847
# 1475504446660 10/03/2016 10:20:46:660000 2123908
注意
如果您不想将timestamp
定义为索引,则可以使用此语法获得相同的结果。
df.query('@start <= timestamp <= @end')
# timestamp DateTime Seq
# 1 1475504446660 10/03/2016 10:20:46:660000 2123908
# 2 1475504524410 10/03/2016 10:22:04:410000 2123953
# 3 1475504848100 10/03/2016 10:27:28:100000 2124067
您需要将开始和结束时间戳转换为实际的熊猫时间戳对象,并将索引转换为时间戳,然后使用括号进行选择。
df.index = pd.to_datetime(df.index, unit='ms')
start = pd.to_datetime(1475504446660, unit='ms')
end = pd.to_datetime(1575504848100, unit='ms')
df[start:end]
输出
DateTime Seq
timestamp
2016-10-03 14:20:46.660 10/03/2016 10:20:46:660000 2123908
2016-10-03 14:22:04.410 10/03/2016 10:22:04:410000 2123953
2016-10-03 14:27:28.100 10/03/2016 10:27:28:100000 2124067