Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 从年度到月度的爆炸性日期_R - Fatal编程技术网

R 从年度到月度的爆炸性日期

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-

我有年度每股账面价值(bps)数据,需要将其放大为每月的时间序列。我想加入一个月价格系列来计算每月的账面价格(P/B)

我的月度数据如下所示(
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