我正在尝试构建一个面板数据数据帧,它由周期性和“连续”的每日数据组成,这些数据应该相互分配,这样新数据帧的每一行都有周期,周期值 . 数据以及该期间其中一天的 Value 和日期,数据看起来类似于:
> dailycds
Date CDS
1 30-06-2015 194
2 01-07-2015 195
3 02-07-2015 198
4 03-07-2015 198
5 04-07-2015 199
6 30-06-2016 165
7 01-07-2016 172
8 02-07-2016 213
9 03-07-2016 123
10 04-07-2016 321
> periodicassets
Period Assets
1 201506 1314
2 201606 2134
最终,我希望它看起来像这样:
> df
Period Date Assets CDS
1 201506 30-06-2015 1314 194
2 201506 01-07-2015 1314 195
3 201506 02-07-2015 1314 198
4 201506 03-07-2015 1314 198
5 201606 30-06-2016 2134 165
6 201606 01-07-2016 2134 172
7 201606 02-07-2016 2134 213
8 201606 03-07-2016 2134 123
基本上,我们的想法是从日常数据中获取某些行范围,并将它们分配(并合并)到周期性数据中 . 不幸的是,我不能简单地通过提取日期的mm-yyyy部分来做到这一点,因为201506年期间也包含7月至第三期的数据,而第四期与没有期间相关且应该被删除,因为每个期间应该只包含一定的天数(在这种情况下为4天) .
以下是上述示例数据的代码:
dailycds = data.frame(Date = c("30-06-2015", "01-07-2015", "02-07-2015","03-07-2015","04-07-2015","30-06-2016", "01-07-2016", "02-07-2016","03-07-2016","04-07-2016"),
CDS = c(194, 195, 198,198,199,165,172,213,123,321))
dailycds
periodicassets = data.frame(Period = c("201506", "201606"),
Assets = c("1314","2134"))
periodicassets
df = data.frame(Period = c("201506", "201506", "201506", "201506", "201606", "201606", "201606", "201606"),
Date = c("30-06-2015", "01-07-2015", "02-07-2015","03-07-2015", "30-06-2016", "01-07-2016", "02-07-2016", "03-07-2016"),
Assets = c("1314", "1314", "1314", "1314", "2134", "2134", "2134", "2134"),
CDS = c(194, 195, 198, 198, 165, 172, 213, 123))
上下文和其他并发症
因此,正如给定解决方案中所建议的那样,我之前的示例非常具体,可能过于简化 . 因此,为了更接近我的问题,这里还有一些额外的背景:最终,周期性数据是指银行资产的月末持有量,我想在此时间(例如)3天内分配每日CDS数据在月底之前和之后的6天 . 因此,在小组中当然有多个银行,每个银行必须将(相同的)CDS数据分配给其持有 . (例如,如果我有2个银行,我需要3天前和6个月末,我有(3 1 6)* 2天 . )正如评论中所指出的,我总是提到商业/工作日我的问题,因为我的时间序列不包含任何假期等 .
所以,为了公正地解决这个问题,这里只有一个句点来自原文:
> periodicassets
BankName Period value
2 BPCE 201412 112189.50
4 Credit Agricole 201412 81618.76
Date CDS
<dttm> <chr>
1 2015-01-12 46.869
2 2015-01-09 48.121000000000002
3 2015-01-08 48.625999999999998
4 2015-01-07 48.801000000000002
5 2015-01-06 48.633000000000003
6 2015-01-05 46.670999999999999
7 2015-01-02 45.158000000000001
8 2015-01-01 47.32
9 2014-12-31 47.658000000000001
10 2014-12-30 45.843000000000004
11 2014-12-29 47.588999999999999
12 2014-12-26 47.625999999999998
13 2014-12-25 47.697000000000003
14 2014-12-24 47.414999999999999
15 2014-12-23 48.075000000000003
16 2014-12-22 48.085999999999999
17 2014-12-19 47.496000000000002
18 2014-12-18 46.534999999999997
19 2014-12-17 48.149000000000001
可以在这里访问:periodic assets,dailycds
在查看论坛时,我发现了类似的问题,例如:create an index for aggregating daily data to match periodic data和create an index for aggregating daily data to match periodic data,但是,当第一个尝试聚合数据时,第二个已经拥有了我想要的格式(在对象xtime中) .
2 回答
这个问题的关键问题是
Period
如何映射到Date
. 从OP的解密我了解到,每个时期包括实际月份的最后一天加上下个月的前三天,总共4天 .这可以通过一些日期算术和右连接来解决:
每个周期只有4行请求,结果与预期结果一致
df
:必须删除未使用的级别以通过
all.equal()
的严格检查警告
代码已经过测试,可以使用提供的示例数据 . 如果是连续的每日和定期数据,可能需要添加代码以删除不属于4天期限的天数 .
编辑:更真实的样本数据
OP已经更新了他的问题,并通过Dropbox提供更逼真的样本数据 . 现在,
dailycds
包含每日数据(周末除外) . 正如上面的警告中已经提到的,这需要在相关日期过滤dailycds
.OP尚不清楚如何确定在月末之前和之后考虑的日子 . 在这里,我们假设在月末之前3天和之后6天是指日历日而不是工作日 .
编辑2:使用工作日而不是日历日期 .
The OP has clarified他正在使用buiness天而不是日历天 . 这种看似微小的规范变化对选择日期的方式产生了严重影响 .
现在,总是挑选每个月的前6个条目以及该月最后一个交易日之前的最后3个条目(ultimo)和ultimo本身,这将导致3 1 6 = 10个工作日的选择 .
注意,结果数据集包含(3 1 6)* 2个月* 2个库= 40行 .
来自Dropbox的数据
如果Dropbox链接断开:
看看这是否适合你
加入,=“日期”