我有一个拥有超过百万条记录的pandas数据框.其中一列是datetime.我的数据样本如下:
time,x,y,z 2015-05-01 10:00:00,111,222,333 2015-05-01 10:00:03,112,223,334 ...
我需要在特定时期内有效地获取记录.以下天真的方式非常耗时.
new_df = df[(df["time"] > start_time) & (df["time"] < end_time)]
我知道在像MySQL这样的DBMS上,时间字段的索引通过指定时间段来获取记录是有效的.
我的问题是
大熊猫的索引是否df.index = df.time
会使切片过程更快?
如果Q1的答案为"否",那么在大熊猫的特定时间段内获得记录的常用有效方法是什么?
Alexander.. 10
让我们创建一个包含100万行和时间性能的数据帧.该索引是熊猫时间戳.
df = pd.DataFrame(np.random.randn(1000000, 3), columns=list('ABC'), index=pd.DatetimeIndex(start='2015-1-1', freq='10s', periods=1000000))
以下是从最快到最慢排序的结果(在同一台机器上测试,均为0.14.1(不要问...)和最新版本0.17.1):
%timeit df2 = df['2015-2-1':'2015-3-1'] 1000 loops, best of 3: 459 µs per loop (v. 0.14.1) 1000 loops, best of 3: 664 µs per loop (v. 0.17.1) %timeit df2 = df.ix['2015-2-1':'2015-3-1'] 1000 loops, best of 3: 469 µs per loop (v. 0.14.1) 1000 loops, best of 3: 662 µs per loop (v. 0.17.1) %timeit df2 = df.loc[(df.index >= '2015-2-1') & (df.index <= '2015-3-1'), :] 100 loops, best of 3: 8.86 ms per loop (v. 0.14.1) 100 loops, best of 3: 9.28 ms per loop (v. 0.17.1) %timeit df2 = df.loc['2015-2-1':'2015-3-1', :] 1 loops, best of 3: 341 ms per loop (v. 0.14.1) 1000 loops, best of 3: 677 µs per loop (v. 0.17.1)
以下是将Datetime索引作为列的计时:
df.reset_index(inplace=True) %timeit df2 = df.loc[(df['index'] >= '2015-2-1') & (df['index'] <= '2015-3-1')] 100 loops, best of 3: 12.6 ms per loop (v. 0.14.1) 100 loops, best of 3: 13 ms per loop (v. 0.17.1) %timeit df2 = df.loc[(df['index'] >= '2015-2-1') & (df['index'] <= '2015-3-1'), :] 100 loops, best of 3: 12.8 ms per loop (v. 0.14.1) 100 loops, best of 3: 12.7 ms per loop (v. 0.17.1)
所有上述索引技术都产生相同的数据帧:
>>> df2.shape (250560, 3)
在这种情况下,前两种方法中的任何一种似乎都是最好的,第四种方法也可以使用最新版本的Pandas.
让我们创建一个包含100万行和时间性能的数据帧.该索引是熊猫时间戳.
df = pd.DataFrame(np.random.randn(1000000, 3), columns=list('ABC'), index=pd.DatetimeIndex(start='2015-1-1', freq='10s', periods=1000000))
以下是从最快到最慢排序的结果(在同一台机器上测试,均为0.14.1(不要问...)和最新版本0.17.1):
%timeit df2 = df['2015-2-1':'2015-3-1'] 1000 loops, best of 3: 459 µs per loop (v. 0.14.1) 1000 loops, best of 3: 664 µs per loop (v. 0.17.1) %timeit df2 = df.ix['2015-2-1':'2015-3-1'] 1000 loops, best of 3: 469 µs per loop (v. 0.14.1) 1000 loops, best of 3: 662 µs per loop (v. 0.17.1) %timeit df2 = df.loc[(df.index >= '2015-2-1') & (df.index <= '2015-3-1'), :] 100 loops, best of 3: 8.86 ms per loop (v. 0.14.1) 100 loops, best of 3: 9.28 ms per loop (v. 0.17.1) %timeit df2 = df.loc['2015-2-1':'2015-3-1', :] 1 loops, best of 3: 341 ms per loop (v. 0.14.1) 1000 loops, best of 3: 677 µs per loop (v. 0.17.1)
以下是将Datetime索引作为列的计时:
df.reset_index(inplace=True) %timeit df2 = df.loc[(df['index'] >= '2015-2-1') & (df['index'] <= '2015-3-1')] 100 loops, best of 3: 12.6 ms per loop (v. 0.14.1) 100 loops, best of 3: 13 ms per loop (v. 0.17.1) %timeit df2 = df.loc[(df['index'] >= '2015-2-1') & (df['index'] <= '2015-3-1'), :] 100 loops, best of 3: 12.8 ms per loop (v. 0.14.1) 100 loops, best of 3: 12.7 ms per loop (v. 0.17.1)
所有上述索引技术都产生相同的数据帧:
>>> df2.shape (250560, 3)
在这种情况下,前两种方法中的任何一种似乎都是最好的,第四种方法也可以使用最新版本的Pandas.