R:将数据转换为xts对象

时间:2015-10-09 09:25:30

标签: r dataframe time-series xts hft

我有一个.csv文件,其中包含SIZ5(白银期货)的高频数据,我试图把它带到一个xts对象,所以我可以使用" highfrequency"中的一些函数。包。

我使用read.csv函数在R上加载数据。在完成删除Nas并更改时间格式的所有必要修复之后。

f<-read.csv(file = "SIZ5_20150918_ob2.csv",header = FALSE,sep = "",col.names = c("DateTime","Seq","BP","BQ","BO","AP","AQ","AO","BP1","BQ1","BO1","AP1","AQ1","AO1","BP2","BQ2","BO2","AP2","AQ2","AO2","BP3","BQ3","BO3","AP3","AQ3","AO3","BP4","BQ4","BO4","AP4","AQ4","AO4","BP5","BQ5","BO5","AP5","AQ5","AO5","BP6","BQ6","BO6","AP6","AQ6","AO6","BP7","BQ7","BO7","AP7","AQ7","AO7","BP8","BQ8","BO8","AP8","AQ8","AO8","BP9","BQ9","BO9","AP9","AQ9","AO9"),nrows = 600000)
f$DateTime=as.POSIXct(f$DateTime/(10^9), origin="1970-01-01") #timestamp conversion 

good1<-complete.cases(f)
f2<-f[good1,]

我的结果是:

             DateTime      Seq    BP BQ BO    AP AQ AO   BP1 BQ1 BO1   AP1 AQ1 AO1   BP2 BQ2 BO2   AP2 AQ2 AO2   BP3 BQ3 BO3   AP3 AQ3 AO3   BP4 BQ4 BO4   AP4
1 2015-09-17 22:00:00 11539422 15110  1  1 15120  4  3 15105   1   1 15125  17   2 15100   4   3 15130   8   2 15095   7   6 15135   3   1 15090  33   3 15140
2 2015-09-17 22:00:00 11539422 15110  1  1 15120  4  3 15105   1   1 15125  17   2 15100   4   3 15130   8   2 15095   7   6 15135   3   1 15090  33   3 15140
3 2015-09-17 22:00:00 11539422 15110  1  1 15120  2  2 15105   1   1 15125  17   2 15100   4   3 15130   8   2 15095   7   6 15135   3   1 15090  33   3 15140
4 2015-09-17 22:00:00 11539479 15115  1  1 15120  2  2 15110   1   1 15125  17   2 15105   1   1 15130   8   2 15100   4   3 15135   3   1 15095   7   6 15140
5 2015-09-17 22:00:00 11539480 15115  2  2 15120  2  2 15110   1   1 15125  17   2 15105   1   1 15130   8   2 15100   4   3 15135   3   1 15095   7   6 15140
6 2015-09-17 22:00:00 11539482 15115  2  2 15120  2  2 15110   1   1 15125  17   2 15105   1   1 15130   8   2 15100   4   3 15135   3   1 15095   7   6 15140 

*我为了简洁而省略了几列

然后:

> as.xts(f2)
Error in as.POSIXlt.character(x, tz, ...) : 
  character string is not in a standard unambiguous format

所以我试过了:

fxts<-xts(f2[,-1],order.by = f2[,1])

但这就是我得到的:

                Seq    BP BQ BO    AP AQ AO   BP1 BQ1 BO1   AP1 AQ1 AO1   BP2 BQ2 BO2   AP2 AQ2 AO2   BP3 BQ3 BO3   AP3 AQ3 AO3   BP4 BQ4 BO4   AP4 AQ4 AO4
1970-01-01 12247553     0  0  0     0  0  0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
1970-01-01 12247553 15025  1  1 15030 11  9 15020  10  10 15035  19  18 15015  18  17 15040  22  19 15010  27  21 15045  23  17 15005  14  13 15050  36  28
1970-01-01 12836196     0  0  0     0  0  0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
1970-01-01 12836196 15240  1  1 15245  6  5 15235  12  11 15250  11  11 15230  10   9 15255  13  12 15225  12  11 15260  18  16 15220  13  12 15265  16  13
1970-01-01 14167856     0  0  0     0  0  0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0     0   0   0
1970-01-01 14167856 15225 11  9 15230  4  4 15220  19  19 15235  14  14 15215  32  26 15240  27  22 15210  29  25 15245  21  17 15205  24  19 15250  28  22

*再次省略了最后几个列

首先,时间列没有标题,然后所有这些都是1970-01-01(原点),没有任何时间与之关联。还有一堆0,他们不应该。我也尝试使用as.data.frame将其首先转换为数据帧,然后转换为xts,但我得到的结果与上面类似。

编辑:我刚刚意识到它完全忽略了&#34; Seq&#34;列,并粘贴在&#34; Seq&#34;中的时间戳(纳秒)的末尾。柱。它是否正在阅读行号。作为时间戳,以秒为单位,因此只显示所有这些的原点?

我错过了什么吗?请帮忙。如果我需要提供更多信息,请告诉我。

按要求:

str(f2)
'data.frame':   494140 obs. of  62 variables:
 $ DateTime: POSIXct, format: "2015-09-17 22:00:00" "2015-09-17 22:00:00" "2015-09-17 22:00:00" "2015-09-17 22:00:00" ...
 $ Seq     : int  11539422 11539422 11539422 11539479 11539480 11539482 11539555 11539556 11539565 11539565 ...
 $ BP      : int  15110 15110 15110 15115 15115 15115 15115 15115 15115 15115 ...
 $ BQ      : int  1 1 1 1 2 2 2 2 2 2 ...
 $ BO      : int  1 1 1 1 2 2 2 2 2 2 ...
 $ AP      : int  15120 15120 15120 15120 15120 15120 15120 15120 15120 15120 ...
 $ AQ      : int  4 4 2 2 2 2 2 2 2 2 ...
 $ AO      : int  3 3 2 2 2 2 2 2 2 2 ...
 $ BP1     : int  15105 15105 15105 15110 15110 15110 15110 15110 15110 15110 ...
 $ BQ1     : int  1 1 1 1 1 1 1 1 1 1 ...
 $ BO1     : int  1 1 1 1 1 1 1 1 1 1 ...
 $ AP1     : int  15125 15125 15125 15125 15125 15125 15125 15125 15125 15125 ...
 $ AQ1     : int  17 17 17 17 17 17 17 17 17 17 ...
 $ AO1     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ BP2     : int  15100 15100 15100 15105 15105 15105 15105 15105 15105 15105 ...
 $ BQ2     : int  4 4 4 1 1 1 1 1 1 1 ...
 $ BO2     : int  3 3 3 1 1 1 1 1 1 1 ...
 $ AP2     : int  15130 15130 15130 15130 15130 15130 15130 15130 15130 15130 ...
 $ AQ2     : int  8 8 8 8 8 8 8 8 8 8 ...
 $ AO2     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ BP3     : int  15095 15095 15095 15100 15100 15100 15100 15100 15100 15100 ...
 $ BQ3     : int  7 7 7 4 4 4 4 4 4 4 ...
 $ BO3     : int  6 6 6 3 3 3 3 3 3 3 ...
 $ AP3     : int  15135 15135 15135 15135 15135 15135 15135 15135 15135 15135 ...
 $ AQ3     : int  3 3 3 3 3 3 3 4 4 4 ...
 $ AO3     : int  1 1 1 1 1 1 1 2 2 2 ...
 $ BP4     : int  15090 15090 15090 15095 15095 15095 15095 15095 15095 15095 ...
 $ BQ4     : int  33 33 33 7 7 7 7 7 7 7 ...
 $ BO4     : int  3 3 3 6 6 6 6 6 6 6 ...
 $ AP4     : int  15140 15140 15140 15140 15140 15140 15140 15140 15140 15140 ...
 $ AQ4     : int  3 3 3 3 3 3 3 3 3 3 ...
 $ AO4     : int  1 1 1 1 1 1 1 1 1 1 ...
 $ BP5     : int  15085 15085 15085 15090 15090 15090 15090 15090 15090 15090 ...
 $ BQ5     : int  1 1 1 33 33 33 33 33 33 33 ...
 $ BO5     : int  1 1 1 3 3 3 3 3 3 3 ...
 $ AP5     : int  15145 15145 15145 15145 15145 15145 15145 15145 15145 15145 ...
 $ AQ5     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ AO5     : int  4 4 4 4 4 4 4 4 4 4 ...
 $ BP6     : int  15080 15080 15080 15085 15085 15085 15085 15085 15085 15085 ...
 $ BQ6     : int  2 2 2 1 1 1 1 1 2 2 ...
 $ BO6     : int  1 1 1 1 1 1 1 1 2 2 ...
 $ AP6     : int  15150 15150 15150 15150 15150 15150 15150 15150 15150 15150 ...
 $ AQ6     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ AO6     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ BP7     : int  15075 15075 15075 15080 15080 15080 15080 15080 15080 15080 ...
 $ BQ7     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ BO7     : int  2 2 2 1 1 1 1 1 1 1 ...
 $ AP7     : int  15160 15160 15160 15160 15160 15160 15160 15160 15160 15160 ...
 $ AQ7     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ AO7     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ BP8     : int  15070 15070 15070 15075 15075 15075 15075 15075 15075 15075 ...
 $ BQ8     : int  1 1 1 2 2 2 3 3 3 2 ...
 $ BO8     : int  1 1 1 2 2 2 3 3 3 2 ...
 $ AP8     : int  15165 15165 15165 15165 15165 15165 15165 15165 15165 15165 ...
 $ AQ8     : int  3 3 3 3 3 3 3 3 3 3 ...
 $ AO8     : int  2 2 2 2 2 2 2 2 2 2 ...
 $ BP9     : int  0 15060 15060 15070 15070 15070 15070 15070 15070 15070 ...
 $ BQ9     : int  0 3 3 1 1 1 1 1 1 1 ...
 $ BO9     : int  0 3 3 1 1 1 1 1 1 1 ...
 $ AP9     : int  15170 15170 15170 15170 15170 15170 15170 15170 15170 15170 ...
 $ AQ9     : int  6 6 6 6 6 7 7 7 7 7 ...
 $ AO9     : int  1 1 1 1 1 2 2 2 2 2 ...

修改(25/11/15):

midpoint.agg<- function(file, skip = 0, lines = 50000, on = "minutes", k = 5){
  whole_data<- read.csv(file = file,header = FALSE,sep = "",col.names = c("DateTime","Seq","BP","BQ","BO","AP","AQ","AO","BP1","BQ1","BO1","AP1","AQ1","AO1","BP2","BQ2","BO2","AP2","AQ2","AO2","BP3","BQ3","BO3","AP3","AQ3","AO3","BP4","BQ4","BO4","AP4","AQ4","AO4","BP5","BQ5","BO5","AP5","AQ5","AO5","BP6","BQ6","BO6","AP6","AQ6","AO6","BP7","BQ7","BO7","AP7","AQ7","AO7","BP8","BQ8","BO8","AP8","AQ8","AO8","BP9","BQ9","BO9","AP9","AQ9","AO9"),nrows = lines,skip = skip)
  whole_data$DateTime= as.POSIXct(whole_data$DateTime/(10^9), origin="1970-01-01")    #timestamp conversion 
  completecase<- whole_data[complete.cases(whole_data),]
  p<- data.frame(DateTime=completecase$DateTime, BP=completecase$BP, AP=completecase$AP, MP=(completecase$BP+completecase$AP)/2)  #midpoint dataframe
  my_xts<- as.xts(x = p$MP,order.by = p$DateTime)
  myagg<-aggregatets(my_xts, on = on, k = k)
  myagg
}

链接到文件:https://drive.google.com/folderview?id=0BwwnLqZcphbEb09qa0hzVUlQdGs&usp=sharing

所以我按照要求在谷歌硬盘上传数据文件。我已经改变了我的方法,就我如何走到尽头但仍在寻找相同的输出并面临同样的问题。它现在更加奇怪了。

就像我在原帖中说的那样,我有一个SIZ5的高频数据天文件,但是现在我没有在整个文件上运行我的函数,而是将它分成不同的文件,每个文件有50000个数据文件。(你会在我上传的数据文件夹中看到)。这些文件名为&#34; split_aa.csv&#34;,&#34; split_ab.csv&#34;等等。

当我为第一个文件运行我的midpoint.agg(上面给出的)函数时。它完美运行并完全符合我的要求:

> a<- midpoint.agg("split_aa.csv")
> head(a)
                         ts
2015-09-18 03:35:00 15122.5
2015-09-18 03:40:00 15117.5
2015-09-18 03:45:00 15110.0
2015-09-18 03:50:00 15112.5
2015-09-18 03:55:00 15117.5
2015-09-18 04:00:00 15117.5
> length(a)
[1] 86

但是当我在&#34; split-ab.csv&#34;上运行它时由于某种原因,xts函数读取前几个时间戳作为1970/01/01的起源日期,然后从那里汇总数据。因此&#34; b&#34;包含4808544行,是一个73.4mb xts对象:

> b<- midpoint.agg("split_ab.csv")
> head(b)
                         ts
1970-01-01 05:35:00 15027.5
1970-01-01 05:40:00 15027.5
1970-01-01 05:45:00 15027.5
1970-01-01 05:50:00 15027.5
1970-01-01 05:55:00 15027.5
1970-01-01 06:00:00 15027.5
> length(b)
[1] 4808544

我很遗憾为什么会这样。它更奇怪的是它发生在文件夹中的一些文件而不是其余文件。我已经确定问题出现在as.xts函数中,当它试图转换&#34; p&#34;数据框到xts对象。然后前几行读取1970-01-01,然后收敛回常态。我甚至尝试将数据分成100,000行而不是50,000行,我仍然面临同样的问题。我怀疑,就像很多人建议的那样,这可能是数据的问题,但我似乎无法确定问题所在或者甚至是数据。再多看几眼就会有很大的帮助。

如果需要任何其他信息,请与我们联系。

1 个答案:

答案 0 :(得分:0)

&#34; xts函数读取前几个时间戳作为1970/01/01的起源日期&#34;是不正确的。 xts 订单文件中的所有时间戳。如果中的任何为零,则它们将是xts对象中的第一个观察值。

我怀疑,您的CSV中的数据并非您所期望的。在文件&#34; split_ab.csv&#34;中,第23669行和第23670行的时间戳为0。

1442558305629290858 12247553 15025 8 7 15030 5 3 15020 12 11 15035 16 16 15015 20 18 15040 21 18 15010 27 21 15045 24 18 15005 14 13 15050 36 28 15000 23 17 15055 21 20 14995 11 10 15060 24 23 14990 32 10 15065 16 14 14985 8 7 15070 13 10 14980 12 9 15075 15 13
0 12247553 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 12247553 15025 1 1 15030 11 9 15020 10 10 15035 19 18 15015 18 17 15040 22 19 15010 27 21 15045 23 17 15005 14 13 15050 36 28 15000 23 17 15055 21 20 14995 11 10 15060 24 23 14990 32 10 15065 16 14 14985 8 7 15070 13 10 14980 12 9 15075 15 13
1442558318615424792 12248063 15025 1 1 15030 11 9 15020 10 10 15035 19 18 15015 19 18 15040 22 19 15010 27 21 15045 23 17 15005 14 13 15050 36 28 15000 23 17 15055 21 20 14995 11 10 15060 24 23 14990 32 10 15065 16 14 14985 8 7 15070 13 10 14980 12 9 15075 15 13

您需要在转换为xts对象之前清理数据。我对您的数据知之甚少,无法帮助您决定如何处理时间戳为零的行。