我有一个包含几千行的pandas数据框,如下所示:
x.head()
id jname wbdqueue_id startdatetime \
59 1341127 ondemand_build_baspen-w7g 26581 2017-07-31 23:14:56
60 1341126 ondemand_qa_qforchecka 26581 2017-07-31 23:15:35
61 1341125 ondemand_build_bchecka 26581 2017-07-31 23:14:56
63 1341123 ondemand_build_baspen-w7f 26581 2017-07-31 23:10:05
64 1341122 ondemand_update_waspen-w7a 26581 2017-07-31 23:09:32
enddatetime
59 2017-07-31 23:19:12
60 2017-07-31 23:34:12
61 2017-07-31 23:15:30
63 2017-07-31 23:14:56
64 2017-07-31 23:10:00
我想为每个wbdqueue_id获取ondemand_build_baspen-w7g的ondemand_update_waspen-w7a和 enddatetime 的 startdatetime 之间的区别。这样做的方法是什么?
我将CSV文件分类并解析 startdatetime 和 enddatetime 作为时间。然后我按wbdqueue_id分组。我的想法是通过 jname 索引每个组,以便我可以找到我需要的两个 jname 的开始和结束时间戳。 但是当我这样做时,所有其他值都变为NaN或NaT(对于时间列)。
-Sachin
答案 0 :(得分:3)
df.set_index('jname').groupby('wbdqueue_id').apply(
lambda x: x.at['ondemand_update_waspen-w7a', 'startdatetime'] \
- x.at['ondemand_build_baspen-w7f', 'enddatetime']
)
wbdqueue_id
26581 -1 days +23:54:36
dtype: timedelta64[ns]
答案 1 :(得分:1)
我会用所描述的逻辑编写一个函数,使事情非常明确,后续代码很容易理解:
import pandas as pd
def get_time_diff(dff):
start_time = dff[dff.jname.eq('ondemand_update_waspen-w7a')].startdatetime.values[0]
end_time = dff[dff.jname.eq('ondemand_build_baspen-w7g')].enddatetime.values[0]
return pd.Timedelta(end_time - start_time)
然后您可以在group-by
操作中使用该功能:
df.groupby('wbdqueue_id').apply(get_time_diff)
这会产生:
wbdqueue_id
26581 00:09:40
dtype: timedelta64[ns]
请注意我将使用end_time - start_time
,因为从逻辑上讲,您希望返回正时间增量,结束时间总是大于开始时间。
我希望这是有目的的。
答案 2 :(得分:0)
如果您只需要在结果中使用statrdatetime和enddatetime之间的不同,那么您可以试试这个。
df1=df.loc[df.jname.isin(['ondemand_update_waspen-w7a','ondemand_build_baspen-w7f']),:]
df1.groupby('wbdqueue_id').apply(lambda x:x.startdatetime-x.enddatetime.shift())[4]
Out[467]:
wbdqueue_id
26581.0 -1 days +23:55:00
Name: 4, dtype: timedelta64[ns]