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

Getting duration for multiple columns using pandas

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

车站 SSD 自闭症 结束时间
PM111 2021 年 5 月 26 日 04:30:00 下午 2021 年 5 月 26 日 05:00:00 下午 2021 年 5 月 26 日 05:10:00 下午
PM123 2021 年 5 月 26 日 07:00:00 下午 2021 年 5 月 26 日 08:00:00 下午 2021 年 5 月 26 日 08:20:00 下午
CM111 2021 年 5 月 26 日 10:00:00 下午 2021 年 5 月 26 日 10:30:00 下午 2021 年 5 月 26 日 10:40:00 下午

如何获得持续时间,

如果电台以“PM***”开头:从 ASD 到 EndTime 的持续时间

df['Duration']=df.eval("EndTime-ASD").dt.total_seconds()

如果 Station 以“CM***”开头:从 SSD 开始到 EndTime 的持续时间

df['Duration']=df.eval("EndTime-SSD").dt.total_seconds()

我怎样才能得到这个并存储在数据框中,df。预期输出:

车站 SSD 自闭症 结束时间 持续时间
PM111 2021 年 5 月 26 日 04:30:00 下午 2021 年 5 月 26 日 05:00:00 下午 2021 年 5 月 26 日 05:10:00 下午 600
PM123 2021 年 5 月 26 日 07:00:00 下午 2021 年 5 月 26 日 08:00:00 下午 2021 年 5 月 26 日 08:20:00 下午 1200
CM111 2021 年 5 月 26 日 10:00:00 下午 2021 年 5 月 26 日 10:30:00 下午 2021 年 5 月 26 日 10:40:00 下午 2400

使用df.eval() 需要非常长的时间来处理。最好将日期列转换为日期时间格式并直接减去日期时间格式值:

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***”或“CM***”以外的地方开始(以防数据输入错误),并且您想将其标记出来,例如通过将 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