xts对象调用end()返回空日期值的技术问题求助
解决xts对象end()函数返回空值的问题
我之前也遇到过xts包end()函数异常的情况,结合你提供的代码和场景,咱们来梳理下问题和解决方案:
问题重现
你的代码运行后,end(LGQM.DE)返回空日期,但max(index(LGQM.DE))能正确获取最后日期,这说明xts对象的索引是正常存储的,只是end()函数的逻辑出现了异常。
library(quantmod) library(xts) getSymbols("LGQM.DE", from="2017-01-01", to=Sys.Date(), src='yahoo', auto.assign = TRUE, adjust = TRUE) str(LGQM.DE) end(LGQM.DE) # 返回空值 max(index(LGQM.DE)) # 正常返回最后日期
可能的原因
- xts版本兼容性问题:你通过devtools安装的相关包可能依赖特定版本的xts,或者当前xts版本存在bug
- 索引属性异常:
getSymbols返回的xts对象可能存在索引属性损坏的情况(虽然index()能正常读取,但end()依赖的内部属性出了问题)
解决方案
1. 升级或重新安装xts包
首先尝试更新到最新稳定版的xts,这是最直接的解决方式:
# 卸载旧版本 remove.packages("xts") # 安装CRAN稳定版 install.packages("xts") # 或者安装GitHub最新开发版(如果CRAN版仍有问题) # devtools::install_github("joshuaulrich/xts")
安装完成后重启R会话,再测试end()函数是否正常。
2. 重构xts对象修复索引属性
如果升级后问题依然存在,可以尝试重新构造xts对象,重置其内部属性:
# 提取核心数据和索引,重新创建xts对象 LGQM.DE <- xts(coredata(LGQM.DE), order.by = index(LGQM.DE)) # 再次测试end() end(LGQM.DE)
这种方法可以修复可能损坏的内部索引属性。
3. 临时替换end()函数逻辑(无需修改大量内部代码)
如果不想修改blotter等包的内部代码,可以通过assignInNamespace临时重定义xts包的end()函数,让它对xts对象自动使用max(index()):
# 重定义xts包中的end函数 assignInNamespace( "end", function(x, ...) { if (is.xts(x)) { max(index(x)) } else { # 保留原函数对非xts对象的处理逻辑 xts:::end.default(x, ...) } }, ns = "xts" )
这样所有依赖end()的内部功能都会自动使用修正后的逻辑,无需逐一修改调用处。注意:这种方法在重启R或更新xts包后会失效,适合临时应急使用。
内容的提问来源于stack exchange,提问作者hannes101
相关产品推荐
相关产品推荐

