我有一个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
最后将它应用于Pandas Column:
df['Period'] = df['ORDER_RECEIVED_DATE'].apply(lambda x:period(x))
但是在大约100万条唱片上它的速度非常慢。我怎样才能加快速度?
假设你做了一系列日期
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
尝试:
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天来解决。