r-合并不同频率的xts对象



是否可以合并具有不同时间频率的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')

最新更新