使用 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
我有一个数据框,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