Python 熊猫:如何根据列条件计算各组的时差

Python 熊猫:如何根据列条件计算各组的时差,python,pandas,Python,Pandas,我有一个类似的数据集 ,然后是 [这个 Stkcd代表股票ID,Trddt代表日期时间,ss代表0-1变量 现在,对于每只股票,我想确定第一次进入时间,其中ss第一次等于1,以及第一次存在时间,其中ss在第一次1之后等于0。然后我想计算每只股票的第一次进入时间和第一次存在时间之间的时间差 我现在的困难是如何识别第一次进入时间和第一次存在时间。有人帮我吗?我对这个问题非常失望。非常感谢!这是一个用于测试的小型数据帧 df = pandas.DataFrame([ {'Stkcd' : 1,

我有一个类似的数据集 ,然后是 [这个

Stkcd代表股票ID,Trddt代表日期时间,ss代表0-1变量

现在,对于每只股票,我想确定第一次进入时间,其中ss第一次等于1,以及第一次存在时间,其中ss在第一次1之后等于0。然后我想计算每只股票的第一次进入时间和第一次存在时间之间的时间差


我现在的困难是如何识别第一次进入时间和第一次存在时间。有人帮我吗?我对这个问题非常失望。非常感谢!

这是一个用于测试的小型
数据帧

df = pandas.DataFrame([
    {'Stkcd' : 1, 'Trddt' : datetime.datetime(2018, 1, 2), 'ss' : 0},
    {'Stkcd' : 1, 'Trddt' : datetime.datetime(2018, 1, 5), 'ss' : 0},
    {'Stkcd' : 1, 'Trddt' : datetime.datetime(2018, 1, 7), 'ss' : 0},
    {'Stkcd' : 1, 'Trddt' : datetime.datetime(2018, 2, 2), 'ss' : 1},
    {'Stkcd' : 1, 'Trddt' : datetime.datetime(2018, 3, 2), 'ss' : 1},
    {'Stkcd' : 1, 'Trddt' : datetime.datetime(2018, 7, 2), 'ss' : 1},
    {'Stkcd' : 1, 'Trddt' : datetime.datetime(2018, 7, 2), 'ss' : 0},
])
这就是代码

# change this to the id you need
stock_id = 1

idx_entry = df[(df['Stkcd'] == stock_id) & (df['ss'] == 1)]['Trddt'].idxmin()
idx_exit = df[(df['Stkcd'] == stock_id) & (df['ss'] == 0) & (df.index > idx_entry)]['Trddt'].idxmin()

t_entry = df.loc[idx_entry, 'Trddt']
t_exit = df.loc[idx_exit, 'Trddt']

# the difference in times
print(t_exit - t_entry)
对于上述测试,这是结果

150 days 00:00:00

下面是一种方法。假设您有以下数据帧:

 Stkcd       date  ss
0      1 2018-04-01   0
1      1 2018-04-05   0
2      1 2018-04-06   1
3      1 2018-04-08   0
4      2 2018-12-19   1
5      2 2018-12-20   1
6      2 2018-12-22   0
7      2 2018-12-25   0
首先,您可以确定第一次进入的时间:

df = df.sort_values(by='Stkcd').reset_index(drop=True)
df_max = df.groupby('Stkcd',sort=False).agg({'ss':'idxmax'}).rename(columns={'ss':'idx_max'})
indices_max = df_max['idx_max'].values
第一次退出时:

df_ = df_max.merge(df, on = 'Stkcd')
df2 = df_.groupby('Stkcd').apply(lambda x: x.loc[x.idx_max.unique()[0]:,:])
indices_min = df2.reset_index(level=0, drop=True).groupby('Stkcd').agg({'ss':'idxmin'}).values.ravel()
要获得时差:

final_df = pd.merge(df.loc[indices_max], df.loc[indices_min], on='Stkcd')
final_df.assign(time_diff = final_df.date_y-final_df.date_x)[['Stkcd','time_diff']]

    Stkcd time_diff
0      1    2 days
1      2    3 days

请将数据和格式粘贴为代码,而不是张贴图像。为我们节省一些打字时间