我有一个时间序列数据集。这是一个数据示例:
firm evntdate date evntdum ret mrktret bef_sum
1 03251110 1989-08-01 1989-02-23 1 -0.00498 0.00053 110
2 03251110 1989-08-01 1989-02-24 1 -0.00500 -0.00494 110
3 03251110 1989-08-01 1989-02-27 1 0.00503 -0.00125 110
4 03251110 1989-08-01 1989-02-28 1 0.00500 0.00392 110
5 03251110 1989-08-01 1989-03-01 1 -0.00498 -0.00040 110
6 03251110 1989-08-01 1989-03-02 1 0.00000 0.00503 110数据集包括有关公司(' firm ')和事件日期('evntdate')的信息。对于每个事件日期,在事件日期之前有多个每日退货('ret'),因此对于每个特定事件,必须有一个唯一的公司和事件日期,重复的次数与我的每日退货次数一样多。'bef_sum‘是一个数字,表示在事件日期之前每天返回的次数,如果每行属于相同的公司/事件日期,则该数字会重复每一行。
我想要做的是创建另一个列,它将创建一个日期计数器,这样第一个日收益(基于' date ')将是-110,下一个是-109 (因为这个计数器是相对于事件日期的),因此fort。我遇到的困难是,对于每个公司/事件日期,这个计数器应该是独立的,我不能使用事件日期减去日期的简单减法,因为这是交易日,所以不应该考虑节假日/周末。
发布于 2011-02-22 04:46:20
以下是使用plyr包获得所需内容的一种方法(我将在我创建的示例数据框中显示它,删除与此问题无关的列,如returns等):
> require(plyr)
> ddply( df, .(firm, evntdate), transform,
DateCount = -1 - bef_sum + seq_along( bef_sum))
firm evntdate date bef_sum DateCount
1 1 1989-08-01 1989-07-01 7 -7
2 1 1989-08-01 1989-07-04 7 -6
3 1 1989-08-01 1989-07-07 7 -5
4 1 1989-08-01 1989-07-10 7 -4
5 1 1989-08-01 1989-07-13 7 -3
6 1 1989-08-01 1989-07-16 7 -2
7 1 1989-08-01 1989-07-19 7 -1
8 1 1990-08-01 1990-07-01 5 -5
9 1 1990-08-01 1990-07-05 5 -4
10 1 1990-08-01 1990-07-09 5 -3
11 1 1990-08-01 1990-07-13 5 -2
12 1 1990-08-01 1990-07-17 5 -1一般来说,您可以使用fCalendar包处理假日和周末等问题--如果您使用这样的包,则可以直接计算evntdate和date之间的“交易天数”。
发布于 2011-02-22 04:29:36
您尝试过timeDate library中的函数吗?例如,函数holidayNYSE()返回给定年份纽约证券交易所的假日。您可以使用此列表删除不适用的天数。
https://stackoverflow.com/questions/5070151
复制相似问题