[英]Improving performance of datetime comparison in pandas
我有一個熊貓數據框,其值如下:
df['ORDER_RECEIVED_DATE'].head()
Out[91]:
0 2018-01-01
1 2018-01-01
2 2018-01-01
3 2018-01-01
4 2018-01-01
我正在定義一個自定義函數來創建另一個列“ Period”,具體取決於與“ ORDER_RECEIVED_DATE”中的日期值進行比較
def period(x):
if x<pd.to_datetime('01-04-2018'):
y=0
elif x<pd.to_datetime('04-05-2018'):
y=1
elif x<pd.to_datetime('05-31-2018'):
y=2
elif x<pd.to_datetime('08-02-2018'):
y=3
elif x<pd.to_datetime('09-27-2018'):
y=4
elif x<pd.to_datetime('01-03-2019'):
y=5
elif x<pd.to_datetime('02-14-2019'):
y=6
elif x<pd.to_datetime('03-28-2019'):
y=7
else:
y=8
return y
最后將其應用於“熊貓專欄”:
df['Period'] = df['ORDER_RECEIVED_DATE'].apply(lambda x:period(x))
但是,在記錄約100萬條記錄時,速度非常慢。 我如何加快速度?
嘗試:
old_date = '01-01-1970'
future_date = '01-01-2050'
cuts = pd.to_datetime([old_date, '01-04-2018', '04-05-2018', '05-31-2018',
'08-02-2018', '09-27-2018', '01-03-2019',
'02-14-2019', '03-28-2019', future_date])
df = pd.DataFrame({'date': pd.date_range('01-01-2018', '04-05-2019', freq='MS')})
df['ped'] = pd.cut(df['date'], bins=cuts).cat.codes
輸出:
+----+---------------------+-------+
| | date | ped |
|----+---------------------+-------|
| 0 | 2018-01-01 00:00:00 | 0 |
| 1 | 2018-02-01 00:00:00 | 1 |
| 2 | 2018-03-01 00:00:00 | 1 |
| 3 | 2018-04-01 00:00:00 | 1 |
| 4 | 2018-05-01 00:00:00 | 2 |
| 5 | 2018-06-01 00:00:00 | 3 |
| 6 | 2018-07-01 00:00:00 | 3 |
| 7 | 2018-08-01 00:00:00 | 3 |
| 8 | 2018-09-01 00:00:00 | 4 |
| 9 | 2018-10-01 00:00:00 | 5 |
| 10 | 2018-11-01 00:00:00 | 5 |
| 11 | 2018-12-01 00:00:00 | 5 |
| 12 | 2019-01-01 00:00:00 | 5 |
| 13 | 2019-02-01 00:00:00 | 6 |
| 14 | 2019-03-01 00:00:00 | 7 |
| 15 | 2019-04-01 00:00:00 | 8 |
+----+---------------------+-------+
編輯:結束日期存在問題,即2019-03-28
在此代碼中給出7而不是您的代碼中的8
。 這可以通過將閾值降低1天來解決。
假設您要排列日期
dates = pd.to_datetime([
'01-04-2018', '04-05-2018', '05-31-2018',
'08-02-2018', '09-27-2018', '01-03-2019',
'02-14-2019', '03-28-2019'
]).values
您可以使用searchsorted
,它會告訴您每個比較日期按dates
順序排列的位置
df.assign(Period=dates.searchsorted(df.ORDER_RECEIVED_DATE))
ORDER_RECEIVED_DATE Period
0 2018-01-01 0
1 2018-02-01 1
2 2018-03-01 1
3 2018-04-01 1
4 2018-05-01 2
5 2018-06-01 3
6 2018-07-01 3
7 2018-08-01 3
8 2018-09-01 4
9 2018-10-01 5
10 2018-11-01 5
11 2018-12-01 5
12 2019-01-01 5
13 2019-02-01 6
14 2019-03-01 7
15 2019-04-01 8
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.