Stkcd代表股票ID,Trddt是日期时间,ss是0-1变量。
现在,对于每只股票,我想确定ss第一次等于1的第一个进入时间,以及在第一个1之后ss等于0的第一个存在时间。然后,我想计算时间差在每种股票的首次进入时间和首次存在时间之间。
我现在面临的困难是如何确定首次进入时间和首次存在时间。有人帮我吗?我对这个问题感到非常沮丧。非常感谢!
答案 0 :(得分:0)
这是一个小的dframe
供测试
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
答案 1 :(得分:0)
这是一种方法。假设您具有以下数据框:
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