После тестирования трех вариантов использование numpy с объектами панд является самым быстрым.Это весьма важно, когда набор данных становится больше и когда вы тестируете «выходные данные» отдельно от создания массива numpy.
* Только кадр данных Pandas
%%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)
* Только 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)
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)
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)
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)