ด้วยการทดสอบของฉันpandas
รุ่นตอนนี้คุณสามารถตอบคำถามนี้ได้ง่ายขึ้นด้วยรหัสอ่านได้มากขึ้นโดยเพียงแค่ใช้0.22.0
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')})
สมมติว่าคุณต้องการคว้าเดทระหว่าง 27 พ.ย. 2561 และ 15 ม. ค. 2562:
# 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
สังเกตเห็นอาร์กิวเมนต์รวม มีประโยชน์มากเมื่อคุณต้องการชัดเจนเกี่ยวกับช่วงของคุณ แจ้งให้ทราบเมื่อตั้งค่าเป็น True เราจะส่งคืนวันที่ 27 พฤศจิกายน 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
วิธีนี้ยังเร็วกว่าisin
วิธีที่กล่าวถึงก่อนหน้านี้:
%%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)
แต่ก็เป็นไม่ได้เร็วกว่าคำตอบที่ได้รับการยอมรับในขณะนี้ให้บริการโดย unutbu เท่านั้นหากหน้ากากถูกสร้างขึ้นแล้ว แต่ถ้ามาส์กนั้นเป็นแบบไดนามิกและจำเป็นต้องกำหนดใหม่เป็นวรรคเป็นเวรวิธีการของฉันอาจมีประสิทธิภาพมากกว่า:
# 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)