R 如何将每日xts合并为稀疏时间索引xts?
我有一个多列xts对象,它达到了第二精度。然后我有另一个xts对象,它每天包含一个值。我想在主xts对象中添加每日值作为一列。以下是一个例子:R 如何将每日xts合并为稀疏时间索引xts?,r,merge,xts,R,Merge,Xts,我有一个多列xts对象,它达到了第二精度。然后我有另一个xts对象,它每天包含一个值。我想在主xts对象中添加每日值作为一列。以下是一个例子: Sys.setenv(TZ = "UTC") library(xts) set.seed(777) xt = xts( data.frame(A=1:20,B=201:220,C=round(runif(20)*10,1)), order.by = as.POSIXct("2015-06-21") + (runif(20) * 86400 *
Sys.setenv(TZ = "UTC")
library(xts)
set.seed(777)
xt = xts( data.frame(A=1:20,B=201:220,C=round(runif(20)*10,1)),
order.by = as.POSIXct("2015-06-21") + (runif(20) * 86400 * 14) )
xd = xts( round(runif(14) - 0.5,1), as.Date("2015-06-21") + (1:14))
使用merge
不起作用:xd
条目得到一个“00:00:00”时间戳,因此它们都不匹配,因此我得到一个包含大量NAs的xts对象:
A B C xd
2015-06-21 10:04:36 5 205 7.0 NA
2015-06-22 00:00:00 NA NA NA -0.5
2015-06-23 00:00:00 NA NA NA -0.2
2015-06-23 11:42:38 4 204 10.0 NA
2015-06-24 00:00:00 NA NA NA 0.1
...
预期结果:
A B C xd
2015-06-21 10:04:36 5 205 7.0 NA
2015-06-23 11:42:38 4 204 10.0 -0.2
2015-06-24 21:16:18 18 218 8.7 0.1
2015-06-25 02:30:24 15 215 8.7 -0.2
2015-06-25 07:48:42 16 216 1.0 -0.2
2015-06-25 15:04:34 14 214 5.9 -0.2
2015-06-26 07:50:09 1 201 6.9 -0.3
2015-06-27 19:28:33 7 207 3.5 0.5
...
要点:
- 实际数据将比本例大得多,因此应避免过度使用内存和CPU
- 如上所示,在xd中,NAs或丢失日期是可能的(尽管相对罕见)
- 在
中有一些日期没有表示(如上面缺少的2015-06-22所示)。我不想为这样的日子创建条目。(我想我可以使用xt
删除它们,但有可能(在我的简单示例中没有显示)在我不想删除的数据中有一些真实的NAs。)na.ommit
<强> Update:< /St>作为原始数据丢失的代码> No>代码>的例子,考虑<代码> xt(10,'b')< p>以获得您想要的,您希望将xd时间戳精确地合并到xd时间戳(到子秒级别)。因此,一种方法是在时区的每个日历日的xt中找到第一个时间戳,并使用该时间戳作为xd中该日的索引值
假设您在交易日开始时(00:00:00)知道xd的值,您可以这样做(如果您仅在交易日结束时知道xd的值,下面的代码需要稍微调整):Sys.setenv(TZ=“UTC”)
图书馆(xts)
种子(777)
图书馆(lubridate)
xt=xts(数据帧(A=1:20,B=201:220,C=round(runif(20)*10,1)),
order.by=as.POSIXct(“2015-06-21”)+(runif(20)*86400*14))
#使用一致的时间索引顺序(都是POSIXct):
xd=xts(圆形(runif(14)-0.5,1),如POSIXct(“2015-06-21”)+天(1:14))
#由于xd元素每次都是随机创建的:
xd2要获得所需的内容,您需要将xd时间戳完全合并到xd时间戳上(到亚秒级)。因此,一种方法是在时区的每个日历日的xt中找到第一个时间戳,并使用该时间戳作为xd中该日的索引值
假设您在交易日开始时(00:00:00)知道xd的值,您可以这样做(如果您仅在交易日结束时知道xd的值,下面的代码需要稍微调整):
Sys.setenv(TZ=“UTC”)
图书馆(xts)
种子(777)
图书馆(lubridate)
xt=xts(数据帧(A=1:20,B=201:220,C=round(runif(20)*10,1)),
order.by=as.POSIXct(“2015-06-21”)+(runif(20)*86400*14))
#使用一致的时间索引顺序(都是POSIXct):
xd=xts(圆形(runif(14)-0.5,1),如POSIXct(“2015-06-21”)+天(1:14))
#由于xd元素每次都是随机创建的:
xd2我这样做的“规范”方式是:
合并两个对象
对结果调用na.locf
子集,使其仅包含所需的索引值
您可以通过merge.xts
函数的fill
参数执行na.locf
调用。例如:
xtd <- merge(xt, xd, fill=na.locf)[index(xt)]
我这样做的“规范”方式是:
合并两个对象
对结果调用na.locf
子集,使其仅包含所需的索引值
您可以通过merge.xts
函数的fill
参数执行na.locf
调用。例如:
xtd <- merge(xt, xd, fill=na.locf)[index(xt)]
顺便说一句,我的“避免内存过多”的观点与一个想法有关,我(简短地)不得不使用na.locf
和seq
在xd
中每秒创建一个条目,这样合并就可以工作(例如)需要86400行(如果xt
使用毫秒,则会变得更愚蠢)!顺便说一句,我的“避免内存过多”的观点与一个想法有关,我(简短地)不得不使用na.locf
和seq
在xd
中每秒创建一个条目,这样合并就可以工作(例如)需要86400行(如果xt
使用毫秒,则会变得更愚蠢)!谢谢你在回答这个问题时所付出的努力!但肯定不会那么复杂吧?xts索引处理是如此复杂,它肯定会有所帮助。顺便说一句,使用-9999暂时表示NA是相当危险的-您永远不知道代码何时将用于与您目前看到的数据范围不同的数据。(我想说-Inf
或NaN
比-9999更安全,但我认为它们同样容易受到攻击。)关于临时NA替换,您是对的,Inf是一个更干净的选择,并且与NA.locf一起工作。虽然NaN似乎不与na.locf合作。感谢您在回答中所做的努力!但肯定不会那么复杂吧?xts索引处理是如此复杂,它肯定会有所帮助。顺便说一句,使用-9999暂时表示NA是相当危险的-您永远不知道代码何时将用于与您目前看到的数据范围不同的数据。(我想说-Inf
或NaN
比-9999安全,但它们也同样脆弱。)在临时NA替换方面,您是对的,Inf是一个更清洁的选择,并且可以使用NA.locf。虽然NaN似乎不与na.locf.Thank合作,但这很容易。虽然当xt
已经包含了应该保留的NA
值时,它确实会出错(我刚刚编辑了我的问题以显示一个示例)。@DarrenCook:这很容易解决。只需在merge
调用之外执行na.locf
。我将编辑我的答案。谢谢-这很简单。尽管当xt
已经包含NA
值时,它确实会出错
xtd <- merge(xt, xd, fill=na.locf)[index(xt)]
xtd <- merge(xt, xd)
xtd[,"xd"] <- na.locf(xtd[,"xd"])
xtd <- xtd[index(xt)]