使用pandas获取多个列的持续时间



我有一个数据框架,df如下:

<表类> 站 SSD ASD EndTime tbody><<tr>PM11126日—2021年5月——04:30:00点26日—2021年5月——05:00:00点26日—2021年5月——05:10:00点PM12326日—2021年5月——07:00:00点26日—2021年5月——08:00:00点26日—2021年5月——08:20:00点CM11126日—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

最新更新