标签: xts

R子集XTS工作日

如何将xts对象的子集仅包括工作日(周一至周五,周六和周日除外)?

r xts

13
推荐指数
2
解决办法
5169
查看次数

R xts和data.table

我可以像使用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)

r xts data.table

12
推荐指数
2
解决办法
4140
查看次数

为什么apply()返回一个转置的xts矩阵?

我想在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)

r apply xts

12
推荐指数
1
解决办法
5174
查看次数

将200万行日期字符串加速转换为POSIX.ct

我有一个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而不是其他一些方法,比如设置数据库.话虽如此,我愿意通过任何方法来实现这一目标,以实现最快的转换.

我非常感谢任何帮助.提前致谢.

posix r time-series posixct xts

12
推荐指数
1
解决办法
2075
查看次数

哪个是在R中重复应用脚本到n .csv文件的最佳方法?

我的情况:

  1. 我有许多csv文件都具有相同的后缀.csv,但文件名的前两个字符是不同的(即AA01.csv,AB01.csv,AC01.csv等)
  2. 我有一个R脚本,我想在每个文件上运行.该文件基本上从.csv中提取数据并将它们分配给向量/将它们转换为时间序列对象.(例如,AA01 xts timeseries对象,AB01 xts对象)

我想要实现的目标:

  1. 将脚本嵌入更大的循环(或适当),以顺序运行每个文件并应用脚本
  2. 删除创建的中间对象(请参阅下面的代码段)
  3. 给我留下从每个原始数据文件创建的最终xts对象(即AA01到AC01等作为值/向量等)

在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)

任何有关如何做到这一点的帮助将非常感激.

loops r xts

11
推荐指数
2
解决办法
6166
查看次数

滚动窗口在不规则的时间序列

我有一个不规则的时间序列事件(帖子)使用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.rollingPerformanceAnalytics等,他们都承担一定的时间序列数据.我尝试将所有时间都改变到帖子发生的那一天,并使用类似于ddply每天分组的东西,这让我很接近.但是,用户可能不会每天发布,因此时间序列仍然是不规则的.我可以用0填补空白,但这可能会使我的数据大量膨胀,而且已经非常大了.

我该怎么办?

r time-series zoo xts

11
推荐指数
2
解决办法
2684
查看次数

合并大量的xts对象

我有一个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对象.

merge r list zoo xts

11
推荐指数
2
解决办法
4690
查看次数

较长的物体长度不是较短物体长度的倍数?

我不明白为什么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)

这会导致警告.

目的是减去工作日的平均值.尽管有警告,它似乎仍然有效,但我应该担心什么?

修订后的解决方案:尝试2

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)

然后检查一些日期,它似乎与日历一致.

r xts

11
推荐指数
1
解决办法
11万
查看次数

R:在一个日期加1个月

我希望得到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)

那么,获得正确输出的最简单的解决方案是什么?

r dataframe zoo xts r-rook-package

11
推荐指数
2
解决办法
8417
查看次数

仅按时间序列填写NA到有限的数量

有没有办法我们可以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)

r time-series zoo xts

11
推荐指数
1
解决办法
1157
查看次数

标签 统计

r ×10

xts ×10

zoo ×4

time-series ×3

apply ×1

data.table ×1

dataframe ×1

list ×1

loops ×1

merge ×1

posix ×1

posixct ×1

r-rook-package ×1