我有一个数据框架,df如下:
<表类>
站
SSD
ASD
EndTime
tbody><<tr>PM111 26日—2021年5月——04:30:00点 26日—2021年5月——05:00:00点 26日—2021年5月——05:10:00点 PM123 26日—2021年5月——07:00:00点 26日—2021年5月——08:00:00点 26日—2021年5月——08:20:00点 CM111 26日—2021年5月——10:00:00点 26日—2021年5月——10:30:00点 26日—2021年5月——10:40:00点 表类>
使用df.eval()
需要非常长的处理时间。最好将日期列转换为datetime格式,然后直接减去datetime格式的值:
import numpy as np
df['Duration'] = np.where(df['Station'].str.startswith("CM"),
(pd.to_datetime(df['EndTime']) - pd.to_datetime(df['SSD'])).dt.total_seconds(),
(pd.to_datetime(df['EndTime']) - pd.to_datetime(df['ASD'])).dt.total_seconds()).astype(int)
结果:
print(df)
Station SSD ASD EndTime Duration
0 PM111 26-MAY-2021 04:30:00 PM 26-MAY-2021 05:00:00 PM 26-MAY-2021 05:10:00 PM 600
1 PM123 26-MAY-2021 07:00:00 PM 26-MAY-2021 08:00:00 PM 26-MAY-2021 08:20:00 PM 1200
2 CM111 26-MAY-2021 10:00:00 PM 26-MAY-2021 10:30:00 PM 26-MAY-2021 10:40:00 PM 2400
如果Station
起动而不是"PM"***;* * *"或"厘米;(只是在数据输入错误的情况下),你想要标记出来,例如通过设置Duration
为一些特殊的值,例如NaN
,你也可以使用np.select()
,如下所示:
import numpy as np
condlist = [df['Station'].str.startswith("PM"),
df['Station'].str.startswith("CM")]
choicelist = [(pd.to_datetime(df['EndTime']) - pd.to_datetime(df['ASD'])).dt.total_seconds(),
(pd.to_datetime(df['EndTime']) - pd.to_datetime(df['SSD'])).dt.total_seconds()]
df['Duration'] = np.select(condlist, choicelist, default=np.nan)
结果:
(在最后一行添加了一个新的测试用例):
print(df)
Station SSD ASD EndTime Duration
0 PM111 26-MAY-2021 04:30:00 PM 26-MAY-2021 05:00:00 PM 26-MAY-2021 05:10:00 PM 600.0
1 PM123 26-MAY-2021 07:00:00 PM 26-MAY-2021 08:00:00 PM 26-MAY-2021 08:20:00 PM 1200.0
2 CM111 26-MAY-2021 10:00:00 PM 26-MAY-2021 10:30:00 PM 26-MAY-2021 10:40:00 PM 2400.0
3 XX999 26-MAY-2021 10:00:00 PM 26-MAY-2021 10:30:00 PM 26-MAY-2021 10:40:00 PM NaN