R 从年度到月度的爆炸性日期
我有年度每股账面价值(bps)数据,需要将其放大为每月的时间序列。我想加入一个月价格系列来计算每月的账面价格(P/B) 我的月度数据如下所示(R 从年度到月度的爆炸性日期,r,R,我有年度每股账面价值(bps)数据,需要将其放大为每月的时间序列。我想加入一个月价格系列来计算每月的账面价格(P/B) 我的月度数据如下所示(dput如下): 我想要的是将所有数据点前滚,以便每月显示: date | bps ------------------------ 2012-06-29 | 2.44376 2012-07-31 | 2.44376 2012-08-31 | 2.44376 ... ... 2013-05-
dput
如下):
我想要的是将所有数据点前滚,以便每月显示:
date | bps
------------------------
2012-06-29 | 2.44376
2012-07-31 | 2.44376
2012-08-31 | 2.44376
... ...
2013-05-31 | 2.44376
2013-06-28 | 1.73054
... ...
等等。有人知道在R中使用一种巧妙的、非for循环的方法吗
以下是我的bps数据框的玩具版本:
df = structure(list(date = structure(c(1340892000, 1372341600, 1404050400,
1435586400, 1467208800), class = c("POSIXct", "POSIXt"), tzone = ""), bps =
c(2.44376, 1.73054, 1.68171, 2.07297, 1.77073)), .Names = c("date",
"bps"), class = "data.frame", row.names = c(NA, 5L))
使用不是第一个月的日期有点棘手,但是使用
seq.POSIXt
可以很容易地获得序列。使用lubridate咀嚼枣
库(tidyverse)
图书馆(lubridate)
df%>%变异(日期=上限\日期(日期,'月'),
日期=地图2(日期,
潜在客户(日期-1,默认值=上次(日期)),
seq,by='month'))%>%
unest()%>%
变异(日期=日期-天数(1))
#>bps日期
#> 1 2.44376 2012-06-30
#> 2 2.44376 2012-07-31
#> 3 2.44376 2012-08-31
#> 4 2.44376 2012-09-30
#> 5 2.44376 2012-10-31
#> 6 2.44376 2012-11-30
#> 7 2.44376 2012-12-31
#> 8 2.44376 2013-01-31
#> 9 2.44376 2013-02-28
#> 10 2.44376 2013-03-31
#> 11 2.44376 2013-04-30
#> 12 2.44376 2013-05-31
#> 13 1.73054 2013-06-30
#> 14 1.73054 2013-07-31
#> 15 1.73054 2013-08-31
#> 16 1.73054 2013-09-30
#> 17 1.73054 2013-10-31
#> 18 1.73054 2013-11-30
#> 19 1.73054 2013-12-31
#> 20 1.73054 2014-01-31
#> 21 1.73054 2014-02-28
#> 22 1.73054 2014-03-31
#> 23 1.73054 2014-04-30
#> 24 1.73054 2014-05-31
#> 25 1.68171 2014-06-30
#> 26 1.68171 2014-07-31
#> 27 1.68171 2014-08-31
#> 28 1.68171 2014-09-30
#> 29 1.68171 2014-10-31
#> 30 1.68171 2014-11-30
#> 31 1.68171 2014-12-31
#> 32 1.68171 2015-01-31
#> 33 1.68171 2015-02-28
#> 34 1.68171 2015-03-31
#> 35 1.68171 2015-04-30
#> 36 1.68171 2015-05-31
#> 37 2.07297 2015-06-30
#> 38 2.07297 2015-07-31
#> 39 2.07297 2015-08-31
#> 40 2.07297 2015-09-30
#> 41 2.07297 2015-10-31
#> 42 2.07297 2015-11-30
#> 43 2.07297 2015-12-31
#> 44 2.07297 2016-01-31
#> 45 2.07297 2016-02-29
#> 46 2.07297 2016-03-31
#> 47 2.07297 2016-04-30
#> 48 2.07297 2016-05-31
#> 49 1.77073 2016-06-30
不是特别漂亮,但是加上一个月,回滚一天,你就可以走了:
tmp <- df[rep(seq_len(nrow(df)),each=12),]
mon <- as.numeric(format(tmp$date,"%m")) + 1:12
tmp$date <- as.POSIXct(paste(
as.numeric(format(tmp$date,"%Y")) + (mon > 12),
rep(month.abb,2)[mon],
"01",
sep="-"
), format="%Y-%b-%d") - as.difftime(1,units="days")
tmp
# date bps
#1 2012-06-30 2.44376
#1.1 2012-07-31 2.44376
#1.2 2012-08-31 2.44376
#1.3 2012-09-30 2.44376
#1.4 2012-10-31 2.44376
#1.5 2012-11-30 2.44376
#1.6 2012-12-31 2.44376
#1.7 2013-01-31 2.44376
#1.8 2013-02-28 2.44376
#1.9 2013-03-31 2.44376
#1.10 2013-04-30 2.44376
#1.11 2013-05-31 2.44376
#2 2013-06-30 1.73054
#2.1 2013-07-31 1.73054
#2.2 2013-08-31 1.73054
# etc etc
tmp请在您的示例中包含一些相关数据,例如其他月份的数据。无法用6月份的数据重现您所要求的内容。@AdamQuek-看起来像bps
只是每个月重复,直到下一年接管为止。“我觉得这个问题很好。”最近的邮件-正确。数据每年在特定月份的最后一个工作日(在本例中为6月)重复。我想把年度数据向前滚动,每个月重复一次。但是,df
不是已经“每月出现”了吗,也就是说,2012-06-282013-06-272014-06-292015-06-292016-06-29
@AdamQueck:不,积分是年度的。我只有每年6月的数据,我需要每年6月、7月、8月、9月、10月、11月、12月、1月、2月、3月、4月和5月的数据。第34行看起来可疑-#>34 1.68171 2015-03-01 10:00:00
@alistaire谢谢,但我真的需要月底。一个月的最后一个日历日是可以的,因为我有一个可爱的上一个\u business\u day\u if\u weekend
函数(藏在某处),我可以应用于整个日期列。@latemail是的,它跳过了二月。我猜seq.POSIXt
是在增加一些标准化的天数,而不是仅仅增加月份?@alistaire-是的,“月份”定义得不太清楚,因此在使用它们进行日期操作时,R通常不能很好地发挥作用。@lebelinoz编辑为四舍五入到月的最后一天。它引入了一个新的依赖项,但是base::round.POSIXt
不舍入到月份。
tmp <- df[rep(seq_len(nrow(df)),each=12),]
mon <- as.numeric(format(tmp$date,"%m")) + 1:12
tmp$date <- as.POSIXct(paste(
as.numeric(format(tmp$date,"%Y")) + (mon > 12),
rep(month.abb,2)[mon],
"01",
sep="-"
), format="%Y-%b-%d") - as.difftime(1,units="days")
tmp
# date bps
#1 2012-06-30 2.44376
#1.1 2012-07-31 2.44376
#1.2 2012-08-31 2.44376
#1.3 2012-09-30 2.44376
#1.4 2012-10-31 2.44376
#1.5 2012-11-30 2.44376
#1.6 2012-12-31 2.44376
#1.7 2013-01-31 2.44376
#1.8 2013-02-28 2.44376
#1.9 2013-03-31 2.44376
#1.10 2013-04-30 2.44376
#1.11 2013-05-31 2.44376
#2 2013-06-30 1.73054
#2.1 2013-07-31 1.73054
#2.2 2013-08-31 1.73054
# etc etc