Unixtime 到日期时间和 R 中的 OHLC
Unixtime to datetime and OHLC in R
TLDR;转到下面的答案,我已经提供了我为解决问题所做的工作。
我想在读取的 CSV 文件中更改 unixtime,以便我可以将此 CSV 文件导出到 matlab 用于学校项目。我在该列中有我想要的实际 unixtimes 作为日期(我发现了关于如何在 Whosebug 上执行此操作的问题,但它们不起作用 - 我是什么意思?我在下面使用的代码是在 Whosebug 上找到的,但我没有R 的基础知识)。
在这个问题之后我想使用 Whosebug 上的另一个答案找到数据的 OHLC。问题是我过不了第一关
这些是价格、时间和交易量的导入数据。
X33287 X1331992243 X4.985 X5.72E.00
[1,] 33291 1331992243 4.985 1.0000
[2,] 33291 1331992243 4.988 0.3300
[3,] 33291 1331992243 4.990 1.0000
[4,] 33291 1331992243 4.993 2.7800
[5,] 33292 1331992243 4.998 13.5000
[6,] 33293 1331992243 4.999 0.2660
......
其中第一列是数字,第二列是unixdate时间,第三列价格,第四列。
为了做到这一点,我使用了这个:
使用 test<-read.csv(##FILELOCATION) 导入
test=as.matrix(test) ##我通过实验做了一个矩阵,我猜是##anyway
然后使用
as.POSIXct(time,origin="1970-01-01")
我可以找到实际日期的值(耶!),但我无法用它做任何事情。
看
A=seq(1,10)*0
for (i in 1:10)
{
A[i]=as.vector(as.POSIXct(test[i,2],origin="1970-01-01"))
print(A[i])
}
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992281
它应该是一个日期,而不是 unixtime。然后当我 as.POSIXct(A)
它给我这样的日期
[1] "2012-03-17 11:20:43 NDT" "2012-03-17 11:20:43 NDT" "2012-03-17 11:20:43 NDT" "2012-03-17 11:20:43 NDT"
[5] "2012-03-17 11:20:43 无损检测" "2012-03-17 11:20:43 无损检测" "2012-03-17
我试过了
x=seq(1,length(time))*0
还有
x=seq(1,40)*0 来建立一个向量。
对于(我在 1:10)
{
x[i]<- as.POSIXct(时间[i,2],origin="1970-01-01")
打印(x[i])
}
告诉我尺寸不正确。
也试过
A=seq(1,40)*0
for (i in 1:40)
{
A[i]=as.vector(as.POSIXct(test[i,2],origin="1970-01-01"))
print(A[i])
}
...再次它只输出 Unix 时间,然后当我输入
A
..它只是带来数字列表(num)
[1] 1331992243 1331992243 1331992243 1331992243 1331992243 1331992243 1331992243 1331992281 1331993630
[10] 1331993693 1331993752 1331993754 1331994303 1331994884 1331998567 1331999674 1331999973 1331999984
[19] 1332002200 1332002326 1332002740 133200275
也试过我在另一个问题中看到的...也没有用。
p=test[1:40,2]
A=seq(1,10)*0
for (i in 1:10)
{
A[i]=head(as.POSIXct(as.numeric(as.character(p[i])),origin="1970-01-01"))
print(A[i])
}
编辑:使用 R: Assigning POSIXct class to a data frame
我这样做了:
text=read.csv("d:/test.csv")
X33287 X1331992243 X4.985 X5.72E.00
1 33288 1331992243 4.985 1.0000
2 33289 1331992243 4.988 0.3300
3 33290 1331992243 4.990 1.0000
..............
然后取出额外的列,将其制成矩阵后,
然后删除第一个无用的列
textm=as.matix(text)
textx=textm[,1:3] #redundent oops
这给了我
X1331992243 X4.985 X5.72E.00
[1,] 1331992243 4.985 1.0000
[2,] 1331992243 4.988 0.3300
[3,] 1331992243 4.990 1.0000
..............
然后这有效
myxts <- xts(testx[,2:4], order.by=as.POSIXct(testx[,1], format='%m/%d/%y %H:%M'))
##then you have your answer
to.minutes(myxts)
myxts.Open myxts.High myxts.Low myxts.Close
2012-03-17 11:20:43 4.985 4.999 4.985 4.999
2012-03-17 11:21:21 4.999 4.999 4.999 4.999
2012-03-17 11:43:50 4.907 4.907 4.907 4.907
2012-03-17 11:44:53 4.999 4.999 4.999 4.999
现在我只需要对 1000000 行执行此操作,然后将其导出到 matlab 可以读取的 CSV 文件并开始一些数据分析。我想继续使用 R,但只有几天时间来完成一些滞后指标检查和一个简单的 ANN。
如果您在名为 'dfrm' 的数据框中有一个自 1970 年 1 月 1 日以来的整数秒数 "unixtime" 列和一个名为 time
的列,那么获取日期的方法是
as.Date(as.POSIXct( dfrm$time , origin="170-01-01"))
...但这不是你所展示的。您显然有一个 headerless 文件并且您正在使用默认为 header=TRUE 的 read.csv,除非您明确告诉它不要将 headers 与...一起使用为此... header=FALSE
。如果您没有 headers 并且在 read.csv
调用中没有给它 colnames,那么您将需要使用 head(dfrm) 查看文件,以便您可以使用正确的列名。
如果您使用的是 xts,那么我怀疑转换为日期是否有意义,因为它采用唯一索引值。
这是要测试的 csv
https://www.dropbox.com/s/ej18jchoxf34b58/test.csv?dl=0
我做了什么
test<-read.csv("d:/test.csv" headers=FALSE) ##note it doesnt really matter in my case
test[,2]<- as.POSIXct(test[,2], origin='1970-01-01')
##dont know why but I needed to do this after some guess work, if not then later it will
##work properly... im a noob to R. Perhaps someone can explain or ill find it in the
##manual later.
myxts<- xts(test[,3:4], order.by=as.POSIXct(test[,2], format='%m/%d/%y %H:%M'))
to.minutes(myxts)
我看不出是否使用 headers 有什么不同。
导出我这样做了
write.zoo(xmat, file="/tmp/demo.csv", sep=",") ##or c:/
从
can I write an xts object using write.csv in R
然后输出为 CSV,您可以在 excel 中打开或导入到 matlab。对我来说,因为我在 matlab 中有一些 exp 并且对许多命令感到满意,所以我更喜欢使用它。虽然我确实看到 R 有多少 "easier" 可以用 to.minutes 或 as.matrix 写入,等等命令显示。
TLDR;转到下面的答案,我已经提供了我为解决问题所做的工作。
我想在读取的 CSV 文件中更改 unixtime,以便我可以将此 CSV 文件导出到 matlab 用于学校项目。我在该列中有我想要的实际 unixtimes 作为日期(我发现了关于如何在 Whosebug 上执行此操作的问题,但它们不起作用 - 我是什么意思?我在下面使用的代码是在 Whosebug 上找到的,但我没有R 的基础知识)。
在这个问题之后我想使用 Whosebug 上的另一个答案找到数据的 OHLC。问题是我过不了第一关
这些是价格、时间和交易量的导入数据。
X33287 X1331992243 X4.985 X5.72E.00
[1,] 33291 1331992243 4.985 1.0000
[2,] 33291 1331992243 4.988 0.3300
[3,] 33291 1331992243 4.990 1.0000
[4,] 33291 1331992243 4.993 2.7800
[5,] 33292 1331992243 4.998 13.5000
[6,] 33293 1331992243 4.999 0.2660
......
其中第一列是数字,第二列是unixdate时间,第三列价格,第四列。
为了做到这一点,我使用了这个: 使用 test<-read.csv(##FILELOCATION) 导入 test=as.matrix(test) ##我通过实验做了一个矩阵,我猜是##anyway
然后使用
as.POSIXct(time,origin="1970-01-01")
我可以找到实际日期的值(耶!),但我无法用它做任何事情。
看
A=seq(1,10)*0
for (i in 1:10)
{
A[i]=as.vector(as.POSIXct(test[i,2],origin="1970-01-01"))
print(A[i])
}
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992243
[1] 1331992281
它应该是一个日期,而不是 unixtime。然后当我 as.POSIXct(A)
它给我这样的日期
[1] "2012-03-17 11:20:43 NDT" "2012-03-17 11:20:43 NDT" "2012-03-17 11:20:43 NDT" "2012-03-17 11:20:43 NDT"
[5] "2012-03-17 11:20:43 无损检测" "2012-03-17 11:20:43 无损检测" "2012-03-17
我试过了
x=seq(1,length(time))*0
还有 x=seq(1,40)*0 来建立一个向量。 对于(我在 1:10) { x[i]<- as.POSIXct(时间[i,2],origin="1970-01-01") 打印(x[i]) }
告诉我尺寸不正确。
也试过
A=seq(1,40)*0
for (i in 1:40)
{
A[i]=as.vector(as.POSIXct(test[i,2],origin="1970-01-01"))
print(A[i])
}
...再次它只输出 Unix 时间,然后当我输入
A
..它只是带来数字列表(num)
[1] 1331992243 1331992243 1331992243 1331992243 1331992243 1331992243 1331992243 1331992281 1331993630
[10] 1331993693 1331993752 1331993754 1331994303 1331994884 1331998567 1331999674 1331999973 1331999984
[19] 1332002200 1332002326 1332002740 133200275
也试过我在另一个问题中看到的...也没有用。
p=test[1:40,2]
A=seq(1,10)*0
for (i in 1:10)
{
A[i]=head(as.POSIXct(as.numeric(as.character(p[i])),origin="1970-01-01"))
print(A[i])
}
编辑:使用 R: Assigning POSIXct class to a data frame
我这样做了:
text=read.csv("d:/test.csv")
X33287 X1331992243 X4.985 X5.72E.00
1 33288 1331992243 4.985 1.0000
2 33289 1331992243 4.988 0.3300
3 33290 1331992243 4.990 1.0000
..............
然后取出额外的列,将其制成矩阵后,
然后删除第一个无用的列
textm=as.matix(text)
textx=textm[,1:3] #redundent oops
这给了我
X1331992243 X4.985 X5.72E.00
[1,] 1331992243 4.985 1.0000
[2,] 1331992243 4.988 0.3300
[3,] 1331992243 4.990 1.0000
..............
然后这有效
myxts <- xts(testx[,2:4], order.by=as.POSIXct(testx[,1], format='%m/%d/%y %H:%M'))
##then you have your answer
to.minutes(myxts)
myxts.Open myxts.High myxts.Low myxts.Close
2012-03-17 11:20:43 4.985 4.999 4.985 4.999
2012-03-17 11:21:21 4.999 4.999 4.999 4.999
2012-03-17 11:43:50 4.907 4.907 4.907 4.907
2012-03-17 11:44:53 4.999 4.999 4.999 4.999
现在我只需要对 1000000 行执行此操作,然后将其导出到 matlab 可以读取的 CSV 文件并开始一些数据分析。我想继续使用 R,但只有几天时间来完成一些滞后指标检查和一个简单的 ANN。
如果您在名为 'dfrm' 的数据框中有一个自 1970 年 1 月 1 日以来的整数秒数 "unixtime" 列和一个名为 time
的列,那么获取日期的方法是
as.Date(as.POSIXct( dfrm$time , origin="170-01-01"))
...但这不是你所展示的。您显然有一个 headerless 文件并且您正在使用默认为 header=TRUE 的 read.csv,除非您明确告诉它不要将 headers 与...一起使用为此... header=FALSE
。如果您没有 headers 并且在 read.csv
调用中没有给它 colnames,那么您将需要使用 head(dfrm) 查看文件,以便您可以使用正确的列名。
如果您使用的是 xts,那么我怀疑转换为日期是否有意义,因为它采用唯一索引值。
这是要测试的 csv https://www.dropbox.com/s/ej18jchoxf34b58/test.csv?dl=0 我做了什么
test<-read.csv("d:/test.csv" headers=FALSE) ##note it doesnt really matter in my case
test[,2]<- as.POSIXct(test[,2], origin='1970-01-01')
##dont know why but I needed to do this after some guess work, if not then later it will
##work properly... im a noob to R. Perhaps someone can explain or ill find it in the
##manual later.
myxts<- xts(test[,3:4], order.by=as.POSIXct(test[,2], format='%m/%d/%y %H:%M'))
to.minutes(myxts)
我看不出是否使用 headers 有什么不同。 导出我这样做了 write.zoo(xmat, file="/tmp/demo.csv", sep=",") ##or c:/ 从 can I write an xts object using write.csv in R
然后输出为 CSV,您可以在 excel 中打开或导入到 matlab。对我来说,因为我在 matlab 中有一些 exp 并且对许多命令感到满意,所以我更喜欢使用它。虽然我确实看到 R 有多少 "easier" 可以用 to.minutes 或 as.matrix 写入,等等命令显示。