是否可以合并具有不同时间频率的xts对象?
数据:
xts_daily <- structure(c(0.00268125, -0.00294375, -0.00575625, 0.00111875,
-0.0052875, -0.0206, 0.017525, 0.0053375, -0.0009125, 0.003775,
0.00393125, -0.00575625, -0.0027875, -0.00200625, -0.0040375,
-0.0065375, 0.0059625, 0.00299375, -0.00106875, 0.0047125, 0.001275,
-0.00294375, -0.00481875, 0.00080625, -0.01731875, -0.004975,
0.0165875, 0.002525, 0.00049375, 0.00424375, 0.00111875, -0.0077875,
0.001275, -0.00419375, -0.0165375, 0.0084625, 0.0065875, 0.0022125,
-0.0040375, 0.0069), class = c("xts", "zoo"), na.action = structure(1L, class = "omit", index = 883699200),index = structure(c(883958400,
884044800, 884131200, 884217600, 884304000, 884563200, 884649600,
884736000, 884822400, 884908800), tclass = "Date", tzone = "UTC"), .Dim = c(10L,
4L), .Dimnames = list(NULL, c("data.Open", "data.High", "data.Low",
"data.Close")))
xts_minute <- structure(c(0.125, 0.0625, -0.125, 0.0625, 0, -0.1875, 0.09375,
-0.03125, -0.09375, 0.0625, 0.125, 0.0625, -0.125, 0.09375, -0.03125,
-0.1875, 0.09375, -0.03125, 0.03125, -0.0625, 0, 0.03125, 0.03125,
0, 0, -0.125, -0.03125, 0.09375, -0.09375, 0.0625, 0.03125, 0.125,
-0.09375, 0, 0, -0.125, -0.03125, 0.09375, 0, -0.03125), class = c("xts",
"zoo"), na.action = structure(1L, class = "omit", index = 883729860), index = structure(c(883729920,
883729980, 883730040, 883730100, 883730160, 883730220, 883730280,
883730340, 883730400, 883730460), tzone = "America/Chicago", tclass = c("POSIXct",
"POSIXt")), .Dim = c(10L, 4L), .Dimnames = list(NULL, c("Open",
"High", "Low", "Close")))
这不起作用:
xts::merge.xts(xts_daily, xts_minute, join = 'left')
你可以试试这个:
merge(xts_daily, xts_minute, all = T)
更新
在OP更新后,一个解决方案是:
xts_daily <- as.data.frame(xts_daily)
xts_daily$Date <- row.names(xts_daily)
cln <- ncol(xts_daily) # 7
xts_daily <- xts_daily[, c(cln, 1:(cln-1))]
row.names(xts_daily) <- NULL
xts_minute <- as.data.frame(xts_minute)
xts_minute$Date <- row.names(xts_minute)
cln <- ncol(xts_minute) # 7
xts_minute <- xts_minute[, c(cln, 1:(cln-1))]
row.names(xts_minute) <- NULL
xts_sidebyside <- cbind(xts_minute, xts_daily)
导致(xts_sidebyside
(:
Date Open High Low Close Date data.Open data.High data.Low data.Close
1 1998-01-02 02:32:00 0.12500 0.12500 0.00000 0.03125 1998-01-05 0.00268125 0.00393125 0.00127500 0.00111875
2 1998-01-02 02:33:00 0.06250 0.06250 0.03125 0.12500 1998-01-06 -0.00294375 -0.00575625 -0.00294375 -0.00778750
3 1998-01-02 02:34:00 -0.12500 -0.12500 0.03125 -0.09375 1998-01-07 -0.00575625 -0.00278750 -0.00481875 0.00127500
4 1998-01-02 02:35:00 0.06250 0.09375 0.00000 0.00000 1998-01-08 0.00111875 -0.00200625 0.00080625 -0.00419375
5 1998-01-02 02:36:00 0.00000 -0.03125 0.00000 0.00000 1998-01-09 -0.00528750 -0.00403750 -0.01731875 -0.01653750
6 1998-01-02 02:37:00 -0.18750 -0.18750 -0.12500 -0.12500 1998-01-12 -0.02060000 -0.00653750 -0.00497500 0.00846250
7 1998-01-02 02:38:00 0.09375 0.09375 -0.03125 -0.03125 1998-01-13 0.01752500 0.00596250 0.01658750 0.00658750
8 1998-01-02 02:39:00 -0.03125 -0.03125 0.09375 0.09375 1998-01-14 0.00533750 0.00299375 0.00252500 0.00221250
9 1998-01-02 02:40:00 -0.09375 0.03125 -0.09375 0.00000 1998-01-15 -0.00091250 -0.00106875 0.00049375 -0.00403750
10 1998-01-02 02:41:00 0.06250 -0.06250 0.06250 -0.03125 1998-01-16 0.00377500 0.00471250 0.00424375 0.00690000
merge(xts_daily, xts_minute, join = 'left')
按预期工作。你是说你想要xts_daily
中的所有观测值,以及xts_minute
中的所有观察值,其中index(xts_minute) == index(xts_daily)
。在具有相同索引的两个对象中没有观测结果,因此xts_minute
的所有列都是NA
。
merge(xts_daily, xts_minute, join = 'left')
## data.Open data.High data.Low data.Close Open High Low Close
## 1998-01-05 0.00268125 0.00393125 0.00127500 0.00111875 NA NA NA NA
## 1998-01-06 -0.00294375 -0.00575625 -0.00294375 -0.00778750 NA NA NA NA
## 1998-01-07 -0.00575625 -0.00278750 -0.00481875 0.00127500 NA NA NA NA
## 1998-01-08 0.00111875 -0.00200625 0.00080625 -0.00419375 NA NA NA NA
## 1998-01-09 -0.00528750 -0.00403750 -0.01731875 -0.01653750 NA NA NA NA
## 1998-01-12 -0.02060000 -0.00653750 -0.00497500 0.00846250 NA NA NA NA
## 1998-01-13 0.01752500 0.00596250 0.01658750 0.00658750 NA NA NA NA
## 1998-01-14 0.00533750 0.00299375 0.00252500 0.00221250 NA NA NA NA
## 1998-01-15 -0.00091250 -0.00106875 0.00049375 -0.00403750 NA NA NA NA
## 1998-01-16 0.00377500 0.00471250 0.00424375 0.00690000 NA NA NA NA
根据您对另一个答案的评论:
我想将日期时间与日期合并,也就是说,我想保留日期时间索引。所以,日期列应该在特定日期的每个时间重复它自己。
您似乎想将每日数据与日期时间数据连接起来,并为日期时间数据中的每个观测重复每日数据。
为了证明这一点,我需要创建一些日期时间数据,因为在日常数据的任何一天中都不存在日期时间数据。
xts_days <- xts_daily[1:3,]
datetimes <- seq(as.POSIXct(start(xts_days)), as.POSIXct(end(xts_days)), by = "12 hours")
xts_intra <- xts(head(xts_minute, length(datetimes)), datetimes)
然后将两者合并在一起,并使用fill = na.locf
用最后一次观测值填充所有NA
。
merge(xts_intra, xts_days, fill = na.locf)
## Open High Low Close data.Open data.High
## 1998-01-04 18:00:00 0.1250 0.12500 0.00000 0.03125 0.00268125 0.00393125
## 1998-01-05 06:00:00 0.0625 0.06250 0.03125 0.12500 0.00268125 0.00393125
## 1998-01-05 18:00:00 -0.1250 -0.12500 0.03125 -0.09375 -0.00294375 -0.00575625
## 1998-01-06 06:00:00 0.0625 0.09375 0.00000 0.00000 -0.00294375 -0.00575625
## 1998-01-06 18:00:00 0.0000 -0.03125 0.00000 0.00000 -0.00575625 -0.00278750
## data.Low data.Close
## 1998-01-04 18:00:00 0.00127500 0.00111875
## 1998-01-05 06:00:00 0.00127500 0.00111875
## 1998-01-05 18:00:00 -0.00294375 -0.00778750
## 1998-01-06 06:00:00 -0.00294375 -0.00778750
## 1998-01-06 18:00:00 -0.00481875 0.00127500
我找到了解决方案。变量名称与问题帖子不同,但它适用于我的变量名称:
merged_diff <- merge(data.frame(date=lubridate::date(zoo::index(data_diff))),
data.frame(date = zoo::index(daily_diff), zoo::coredata(daily_diff)), all.x = TRUE, by='date')