我可以像使用data.frame一样将data.table转换为xts对象:
> df = data.frame(x = c("a", "b", "c", "d"), v = rnorm(4))
> dt = data.table(x = c("a", "b", "c", "d"), v = rnorm(4))
> xts(df, as.POSIXlt(c("2011-01-01 15:30:00", "2011-01-02 15:30:00", "2011-01-03 15:50:50", "2011-01-04 15:30:00")))
x v
2011-01-01 15:30:00 "a" "-1.2232283"
2011-01-02 15:30:00 "b" "-0.1654551"
2011-01-03 15:50:50 "c" "-0.4456202"
2011-01-04 15:30:00 "d" "-0.9416562"
> xts(dt, as.POSIXlt(c("2011-01-01 15:30:00", "2011-01-02 15:30:00", "2011-01-03 15:50:50", "2011-01-04 15:30:00")))
x v
2011-01-01 15:30:00 "a" " 1.3089579"
2011-01-02 15:30:00 "b" "-1.7681071"
2011-01-03 15:50:50 "c" "-1.4375100"
2011-01-04 15:30:00 …Run Code Online (Sandbox Code Playgroud) 我想在xts矩阵的所有周期上运行一个函数.apply()非常快,但返回的矩阵与原始对象相比具有转置尺寸:
> dim(myxts)
[1] 7429 48
> myxts.2 = apply(myxts, 1 , function(x) { return(x) })
> dim(myxts.2)
[1] 48 7429
> str(myxts)
An 'xts' object from 2012-01-03 09:30:00 to 2012-01-30 16:00:00 containing:
Data: num [1:7429, 1:48] 4092500 4098500 4091500 4090300 4095200 ...
- attr(*, "dimnames")=List of 2
..$ : NULL
..$ : chr [1:48] "Open" "High" "Low" "Close" ...
Indexed by objects of class: [POSIXlt,POSIXt] TZ:
xts Attributes:
NULL
> str(myxts.2)
num [1:48, 1:7429] 4092500 4098500 4091100 4098500 0 …Run Code Online (Sandbox Code Playgroud) 我有一个csv,其中包含大约200万行日期字符串格式:
2012/11/13 21:10:00
Run Code Online (Sandbox Code Playgroud)
让我们称呼它 csv$Date.and.Time
我想尽快将这些日期(及其附带的数据)转换为xts
我编写了一个脚本,可以很好地执行转换(见下文),但它非常慢,我想尽可能加快速度.
这是我目前的方法.有没有人对如何加快速度提出任何建议?
dt <- as.POSIXct(csv$Date.and.Time,tz="UTC")
idx <- format(dt,tz=z,usetz=TRUE)
Run Code Online (Sandbox Code Playgroud)
因此脚本将这些日期字符串转换为POSIX.ct.然后使用format(z是表示我要转换的TZ的变量)进行时区转换.然后我做一个常规xts调用,使其成为xts系列,其中包含csv中的其余数据.
这100%工作.它非常非常慢.我试过并行运行它(它没有做任何事情;如果有什么事情让它变得更糟)."慢"是什么意思?
user system elapsed
155.246 16.430 171.650
Run Code Online (Sandbox Code Playgroud)
这是一款3GhZ,16GB RAM 2012 mb pro.我可以在Win7机器上使用32GB RAM的类似处理器上获得大约一半
我确信有人有更好的想法 - 我愿意接受建议Rcpp等等.但是,理想情况下,解决方案适用于csv而不是其他一些方法,比如设置数据库.话虽如此,我愿意通过任何方法来实现这一目标,以实现最快的转换.
我非常感谢任何帮助.提前致谢.
我的情况:
我想要实现的目标:
在R中嵌入此脚本的正确方法是什么?对不起,我是编程菜鸟!
我的脚本代码如下...每个CSV中每列的标题是DATE,TIME,VALUE
# Pull in Data from the FileSystem and attach it
AA01raw<-read.csv("AA01.csv")
attach(AA01raw)
#format the data for timeseries work
cdt<-as.character(Date)
ctm<-as.character(Time)
tfrm<-timeDate(paste(cdt,ctm),format ="%Y/%m/%d %H:%M:%S")
val<-as.matrix(Value)
aa01tsobj<-timeSeries(val,tfrm)
#convert the timeSeries object to an xts Object
aa01xtsobj<-as.xts(tsobj)
#remove all the intermediate objects to leave the final xts object
rm(cdt)
rm(ctm)
rm(aa01tsobj)
rm(tfrm)
gc()
Run Code Online (Sandbox Code Playgroud)
然后在每个.csv文件上重复,直到提取所有xts对象.
也就是说,我们最终将在R内,准备进一步应用是:
aa01xtsobj, ab01xtsobj, ac01xtsobj....etc
Run Code Online (Sandbox Code Playgroud)
任何有关如何做到这一点的帮助将非常感激.
我有一个不规则的时间序列事件(帖子)使用xts,我想计算在滚动的每周窗口(或每两周,或3天等)发生的事件的数量.数据如下所示:
postid
2010-08-04 22:28:07 867
2010-08-04 23:31:12 891
2010-08-04 23:58:05 901
2010-08-05 08:35:50 991
2010-08-05 13:28:02 1085
2010-08-05 14:14:47 1114
2010-08-05 14:21:46 1117
2010-08-05 15:46:24 1151
2010-08-05 16:25:29 1174
2010-08-05 23:19:29 1268
2010-08-06 12:15:42 1384
2010-08-06 15:22:06 1403
2010-08-07 10:25:49 1550
2010-08-07 18:58:16 1596
2010-08-07 21:15:44 1608
Run Code Online (Sandbox Code Playgroud)
应该产生类似的东西
nposts
2010-08-05 00:00:00 10
2010-08-06 00:00:00 9
2010-08-07 00:00:00 5
Run Code Online (Sandbox Code Playgroud)
为期2天的窗口.我已研究过rollapply,apply.rolling从PerformanceAnalytics等,他们都承担一定的时间序列数据.我尝试将所有时间都改变到帖子发生的那一天,并使用类似于ddply每天分组的东西,这让我很接近.但是,用户可能不会每天发布,因此时间序列仍然是不规则的.我可以用0填补空白,但这可能会使我的数据大量膨胀,而且已经非常大了.
我该怎么办?
我有一个xts互相排列的对象列表.我想把merge列表变成一个大xts对象.我这样做的尝试是"
merged_reg_1_min_prices <- do.call(cbind, reg_1_min_prices)
Run Code Online (Sandbox Code Playgroud)
然而,这似乎耗尽了记忆. reg_1_min_prices相互排斥的日子是6,000天1分钟的回报,所以它不是很大.有谁知道怎么解决这个问题?
需要明确的是:reg_1_min_prices包含每天1分钟价格的互斥日,列表中的每个条目都是一个xts对象.
我不明白为什么R给我一个关于"较长的物体长度不是较短物体长度的倍数"的警告
我有这个对象,它通过在xts系列上进行聚合生成,给出工作日中位数:
u <- aggregate(d, list(Ukedag = format(index(d),"%w")), median)
1 314.0
2 282.5
3 270.0
4 267.0
5 240.5
Run Code Online (Sandbox Code Playgroud)
然后我尝试将它应用到我的原始xts系列,看起来像这样(只是更长)
head(d)
2009-01-02 116
2009-01-05 256
2009-01-06 286
Run Code Online (Sandbox Code Playgroud)
使用:
coredata(d) <- coredat(d) - u[format(index(d),"%w")];
Run Code Online (Sandbox Code Playgroud)
这会导致警告.
目的是减去工作日的平均值.尽管有警告,它似乎仍然有效,但我应该担心什么?
apply.daily(d, function(x) coredata(x) - u[format(index(x), "%w")] )
Run Code Online (Sandbox Code Playgroud)
我确实有一个严重的错误.这没有给出任何警告,我通过这样做测试:
apply.daily(d, function(x) u[format(index(x), "%w")] )
Run Code Online (Sandbox Code Playgroud)
然后检查一些日期,它似乎与日历一致.
我希望得到a startDate和之间的日期顺序endDate加1个月startDate.即,如果startDate是2013-01-31并且endDate是2013-07-31,我希望看到这样的日期:
"2013-01-31""2013-02-28""2013-03-31""2013-04-30""2013-05-31""2013-06-30""2013-07-31"
我试过了 seq.Date(as.Date("2013-01-31"),by="month",length.out=7).但是这段代码的输出是这样的
> seq.Date(as.Date("2013-01-31"),by="month",length.out=7)
[1] "2013-01-31" "2013-03-03" "2013-03-31" "2013-05-01" "2013-05-31" "2013-07-01" "2013-07-31"
Run Code Online (Sandbox Code Playgroud)
那么,获得正确输出的最简单的解决方案是什么?
有没有办法我们可以NA用一个有限数量的前锋填充一个zoo或一个xts对象NA.换句话说,NA最多连续3次填充s NA,然后将NAs从第4个值保持到有效数字.
像这样的东西.
library(zoo)
x <- zoo(1:20, Sys.Date() + 1:20)
x[c(2:4, 6:10, 13:18)] <- NA
x
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 NA NA NA 5 NA NA
2014-09-27 2014-09-28 2014-09-29 2014-09-30 2014-10-01 2014-10-02 2014-10-03
NA NA NA 11 12 NA NA
2014-10-04 2014-10-05 2014-10-06 2014-10-07 2014-10-08 2014-10-09
NA NA NA NA 19 20
Run Code Online (Sandbox Code Playgroud)
期望的输出,将是变量n = 3的东西
2014-09-20 2014-09-21 2014-09-22 2014-09-23 2014-09-24 2014-09-25 2014-09-26
1 …Run Code Online (Sandbox Code Playgroud)