Với thử nghiệm pandas
phiên bản của tôi, 0.22.0
bây giờ bạn có thể trả lời câu hỏi này dễ dàng hơn với mã dễ đọc hơn bằng cách sử dụng đơn giản between
.
# create a single column DataFrame with dates going from Jan 1st 2018 to Jan 1st 2019
df = pd.DataFrame({'dates':pd.date_range('2018-01-01','2019-01-01')})
Giả sử bạn muốn lấy ngày từ ngày 27 tháng 11 năm 2018 đến ngày 15 tháng 1 năm 2019:
# use the between statement to get a boolean mask
df['dates'].between('2018-11-27','2019-01-15', inclusive=False)
0 False
1 False
2 False
3 False
4 False
# you can pass this boolean mask straight to loc
df.loc[df['dates'].between('2018-11-27','2019-01-15', inclusive=False)]
dates
331 2018-11-28
332 2018-11-29
333 2018-11-30
334 2018-12-01
335 2018-12-02
Lưu ý các đối số bao gồm. rất hữu ích khi bạn muốn rõ ràng về phạm vi của bạn. thông báo khi được đặt thành True, chúng tôi cũng sẽ trả lại vào ngày 27 tháng 11 năm 2018:
df.loc[df['dates'].between('2018-11-27','2019-01-15', inclusive=True)]
dates
330 2018-11-27
331 2018-11-28
332 2018-11-29
333 2018-11-30
334 2018-12-01
Phương pháp này cũng nhanh hơn isin
phương pháp đã đề cập trước đó :
%%timeit -n 5
df.loc[df['dates'].between('2018-11-27','2019-01-15', inclusive=True)]
868 µs ± 164 µs per loop (mean ± std. dev. of 7 runs, 5 loops each)
%%timeit -n 5
df.loc[df['dates'].isin(pd.date_range('2018-01-01','2019-01-01'))]
1.53 ms ± 305 µs per loop (mean ± std. dev. of 7 runs, 5 loops each)
Tuy nhiên, nó không nhanh hơn câu trả lời hiện được chấp nhận, được cung cấp bởi unutbu, chỉ khi mặt nạ đã được tạo . nhưng nếu mặt nạ động và cần được gán lại nhiều lần, phương pháp của tôi có thể hiệu quả hơn:
# already create the mask THEN time the function
start_date = dt.datetime(2018,11,27)
end_date = dt.datetime(2019,1,15)
mask = (df['dates'] > start_date) & (df['dates'] <= end_date)
%%timeit -n 5
df.loc[mask]
191 µs ± 28.5 µs per loop (mean ± std. dev. of 7 runs, 5 loops each)