在numpy数组中,dtype np.datetime64或pandas对象datetime.date更快吗?

时间:2019-01-26 02:32:39

标签: python numpy

我想尽可能快地过滤日期数组吗?我应该使用pandas还是numpy?如果我使用numpy,应该使用哪种数据类型?

我有一个很大的数据框,我需要遍历一个范围并从日期范围中提取数据。由于我还在测试数据并重新运行它,所以它花了我比我需要的时间还要长。

*注意::在寻找答案后,我找不到合适的答案,因此我将其发布,以防其他人遇到类似情况。答案如下。

1 个答案:

答案 0 :(得分:0)

在测试了三个选项之后,将numpy与pandas对象一起使用最快。当数据集变得更大时,以及与创建numpy数组分开测试“输出”时,这一点非常重要。

*仅限熊猫数据框

%%timeit
start_date = date(2015, 1, 26)
end_date = date(2018, 1, 26)

df = pd.DataFrame(pd.date_range(start_date, end_date), columns=['Date'])
df['Date'] = pd.to_datetime(df['Date']).dt.date
df['Range'] = range(df.shape[0])

max_date = date(2017, 1, 1)
df.loc[df['Date'] <= max_date]
3.02 ms ± 126 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

*仅限脾气暴躁

%%timeit
start_date = date(2015, 1, 26)
end_date = date(2018, 1, 26)

df = pd.DataFrame(pd.date_range(start_date, end_date), columns=['Date'])
df['Date'] = pd.to_datetime(df['Date']).dt.date
df['Range'] = range(df.shape[0])

max_date = date(2017, 1, 1)
np_df = np.array(df.values, dtype=np.datetime64)
output = np.where(np_df[:,0] <= max_date)
3.99 ms ± 144 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

带有大熊猫物体的脾气暴躁

%%timeit
start_date = date(2015, 1, 26)
end_date = date(2018, 1, 26)

df = pd.DataFrame(pd.date_range(start_date, end_date), columns=['Date'])
df['Date'] = pd.to_datetime(df['Date']).dt.date
df['Range'] = range(df.shape[0])

max_date = date(2017, 1, 1)
np_df = np.array(df.values)
output = np.where(np_df[:,0] <= max_date)
2.44 ms ± 31.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)