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

2024-05-14 09:24:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

^{tb1}$

我如何获得持续时间

如果车站以“PM***”开始:从ASD开始到结束时间的持续时间

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

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

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

我怎样才能得到它并存储在数据帧中,df。预期产出:

^{tb2}$

Tags: 数据dfeval时间dttotal持续时间seconds
1条回答
网友
1楼 · 发布于 2024-05-14 09:24:06

使用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,则还可以使用^{},如下所示:

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

相关问题 更多 >

    热门问题