任務描述
最近在做上市公司的事件研究,得到了每個事件發生及之後 15 個交易日的時間窗口,已經按照stkcd evendate的順序排好序,下面截取小段 sample 存儲到 test.txt 中。顯然存在很多重疊的時間窗口,所以想去除掉Overlapping的部分,減少下一步工作的工作量。
stkcd | stkname | eventdate | edate |
---|---|---|---|
1 | 平安銀行 | 2017-06-27 | 2017-07-17 |
1 | 平安銀行 | 2017-11-20 | 2017-12-08 |
1 | 平安銀行 | 2018-01-12 | 2018-02-01 |
1 | 平安銀行 | 2018-01-19 | 2018-02-08 |
2 | 萬科A | 2016-12-19 | 2017-01-09 |
2 | 萬科A | 2016-12-21 | 2017-01-11 |
2 | 萬科A | 2018-04-17 | 2018-05-09 |
2 | 萬科A | 2018-04-24 | 2018-05-16 |
2 | 萬科A | 2018-04-27 | 2018-05-21 |
2 | 萬科A | 2018-05-08 | 2018-05-28 |
2 | 萬科A | 2018-05-09 | 2018-05-29 |
2 | 萬科A | 2018-05-10 | 2018-05-30 |
2 | 萬科A | 2018-05-11 | 2018-05-31 |
2 | 萬科A | 2018-05-14 | 2018-06-01 |
2 | 萬科A | 2018-05-15 | 2018-06-04 |
2 | 萬科A | 2018-05-16 | 2018-06-05 |
2 | 萬科A | 2018-05-17 | 2018-06-06 |
2 | 萬科A | 2018-05-18 | 2018-06-07 |
2 | 萬科A | 2018-05-21 | 2018-06-08 |
2 | 萬科A | 2018-05-22 | 2018-06-11 |
2 | 萬科A | 2018-05-31 | 2018-06-21 |
2 | 萬科A | 2018-06-05 | 2018-06-26 |
2 | 萬科A | 2018-06-12 | 2018-07-03 |
2 | 萬科A | 2018-06-29 | 2018-07-19 |
2 | 萬科A | 2018-07-12 | 2018-08-01 |
2 | 萬科A | 2018-07-17 | 2018-08-06 |
2 | 萬科A | 2018-07-24 | 2018-08-13 |
2 | 萬科A | 2018-07-27 | 2018-08-16 |
2 | 萬科A | 2018-07-31 | 2018-08-20 |
2 | 萬科A | 2018-08-08 | 2018-08-28 |
2 | 萬科A | 2018-08-31 | 2018-09-20 |
2 | 萬科A | 2018-09-11 | 2018-10-09 |
2 | 萬科A | 2018-10-16 | 2018-11-05 |
5 | 世紀星源 | 2008-03-31 | 2016-01-22 |
5 | 世紀星源 | 2015-06-30 | 2016-01-22 |
5 | 世紀星源 | 2017-06-07 | 2017-06-27 |
5 | 世紀星源 | 2017-09-11 | 2017-09-29 |
解決思路
大概就是逐行遍歷,用 start 和 end 分別存儲上步更新的時間戳。假如每行時間窗口的起點爲 evendate ,終點爲 edate 。則一共只有以下四種情況:
- edate > end > evendate:
- edate > evendate > end
- start < evendate < edate < end
- evendate < start (一隻股票的序列結束,另一隻股票的序列開始)
根據不同情況分別更新時間戳 start end 即可
實現代碼
import pandas as pd
data = pd.read_table('test.txt',header=0,encoding='utf-8',delim_whitespace=True)
data.columns=['stkcd','stkname','evendate','edate']
start = data.loc[0, 'evendate']
end = data.loc[0, 'edate']
f=[[start,end]]
for i in range(len(data.loc[:,'stkcd'])):
evendate = data.loc[i, 'evendate']
edate = data.loc[i,'edate']
print([start, end])
if edate > end > evendate:
end = edate
f.append([evendate, edate])
elif edate > evendate > end:
start = evendate
end = edate
f.append([evendate, edate])
elif start < evendate < edate < end:
f.append([evendate, edate])
elif evendate < start:
start = evendate
end = edate
f.append([evendate, edate])
運行結果
逐行迭代後的時間戳爲:
迭代時間戳 |
---|
[‘2017-06-27’, ‘2017-07-17’] |
[‘2017-06-27’, ‘2017-07-17’] |
[‘2017-11-20’, ‘2017-12-08’] |
[‘2018-01-12’, ‘2018-02-01’] |
[‘2018-01-12’, ‘2018-02-08’] |
[‘2016-12-19’, ‘2017-01-09’] |
[‘2016-12-19’, ‘2017-01-11’] |
[‘2018-04-17’, ‘2018-05-09’] |
[‘2018-04-17’, ‘2018-05-16’] |
[‘2018-04-17’, ‘2018-05-21’] |
[‘2018-04-17’, ‘2018-05-28’] |
[‘2018-04-17’, ‘2018-05-29’] |
[‘2018-04-17’, ‘2018-05-30’] |
[‘2018-04-17’, ‘2018-05-31’] |
[‘2018-04-17’, ‘2018-06-01’] |
[‘2018-04-17’, ‘2018-06-04’] |
[‘2018-04-17’, ‘2018-06-05’] |
[‘2018-04-17’, ‘2018-06-06’] |
[‘2018-04-17’, ‘2018-06-07’] |
[‘2018-04-17’, ‘2018-06-08’] |
[‘2018-04-17’, ‘2018-06-11’] |
[‘2018-04-17’, ‘2018-06-21’] |
[‘2018-04-17’, ‘2018-06-26’] |
[‘2018-04-17’, ‘2018-07-03’] |
[‘2018-04-17’, ‘2018-07-19’] |
[‘2018-04-17’, ‘2018-08-01’] |
[‘2018-04-17’, ‘2018-08-06’] |
[‘2018-04-17’, ‘2018-08-13’] |
[‘2018-04-17’, ‘2018-08-16’] |
[‘2018-04-17’, ‘2018-08-20’] |
[‘2018-04-17’, ‘2018-08-28’] |
[‘2018-08-31’, ‘2018-09-20’] |
[‘2018-08-31’, ‘2018-10-09’] |
[‘2018-10-16’, ‘2018-11-05’] |
[‘2008-03-31’, ‘2016-01-22’] |
[‘2008-03-31’, ‘2016-01-22’] |
[‘2017-06-07’, ‘2017-06-27’] |
最終的時間範圍則爲每個 start 時間戳對應的最後一行:
最終時間戳 |
---|
[‘2017-06-27’, ‘2017-07-17’] |
[‘2017-11-20’, ‘2017-12-08’] |
[‘2018-01-12’, ‘2018-02-08’] |
[‘2016-12-19’, ‘2017-01-11’] |
[‘2018-04-17’, ‘2018-08-28’] |
[‘2018-08-31’, ‘2018-10-09’] |
[‘2018-10-16’, ‘2018-11-05’] |
[‘2008-03-31’, ‘2016-01-22’] |
[‘2017-06-07’, ‘2017-06-27’] |