使用NAs值创建EURUSD价格表

时间:2015-10-03 14:39:01

标签: r

我有一张包含以下数据的表格:

head(EURUSD0)
                 Date   Open   High    Low  Close
1 2005-05-02 00:00:00 1.2861 1.2861 1.2861 1.2861
2 2005-05-02 00:04:00 1.2860 1.2860 1.2860 1.2860
3 2005-05-02 00:10:00 1.2861 1.2861 1.2861 1.2861
4 2005-05-02 00:11:00 1.2860 1.2860 1.2860 1.2860
5 2005-05-02 00:12:00 1.2861 1.2861 1.2861 1.2861
6 2005-05-02 00:13:00 1.2862 1.2862 1.2861 1.2861

日期定义为POSIXlt:

EURUSD0$Date <- as.POSIXlt(EURUSD0[,1],format = '%Y.%m.%d %H:%M')

我按如下方式创建一个空数据框:

startDate = EURUSD0$Date[1]
endDate = EURUSD0$Date[nrow(EURUSD0)]
dateSeq1min = as.POSIXlt(seq(from=startDate, to=endDate, by="1 min"))
EURUSD <- data.frame(Date=dateSeq1min,
               Open=rep(NA,N),
               High=rep(NA,N),
               Low=rep(NA,N),
               Close=rep(NA,N),
               stringsAsFactors=FALSE) 

即,

head(EURUSD)
                 Date Open High Low Close
1 2005-05-02 00:00:00   NA   NA  NA    NA
2 2005-05-02 00:01:00   NA   NA  NA    NA
3 2005-05-02 00:02:00   NA   NA  NA    NA
4 2005-05-02 00:03:00   NA   NA  NA    NA
5 2005-05-02 00:04:00   NA   NA  NA    NA
6 2005-05-02 00:05:00   NA   NA  NA    NA

我想用EURUSD0中的信息填充此数据框。请注意,EURUSD每分钟都出现一次,而EURUSD0则没有。

我可以使用这个想法来做到这一点:

> (EURUSD0$Date[1] == EURUSD$Date)[1:10]
 [1]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> (EURUSD0$Date[2] == EURUSD$Date)[1:10]
 [1] FALSE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE

但是我有很多数据并且非常昂贵。

任何想法/提示如何继续(以非昂贵的方式)?

1 个答案:

答案 0 :(得分:3)

使用merge的一个解决方案:

merge(EURUSD[1], EURUSD0, by="Date", all.x=T)
                 Date   Open   High    Low  Close
1 2005-05-02 00:00:00 1.2861 1.2861 1.2861 1.2861
2 2005-05-02 00:01:00     NA     NA     NA     NA
3 2005-05-02 00:02:00     NA     NA     NA     NA
4 2005-05-02 00:03:00     NA     NA     NA     NA
5 2005-05-02 00:04:00 1.2860 1.2860 1.2860 1.2860
6 2005-05-02 00:05:00     NA     NA     NA     NA

使用这种方法,带有时间值的简单数据框就足够了:EURUSD <- data.frame(Date=dateSeq1min)

<强>更新

来自?POSIXct的文档:

  

&#34; POSIXct&#34;包含在数据框中更方便,和   &#34; POSIXlt&#34;更接近人类可读的形式。

当我们尝试将数据与不同的类合并时,我们必须小心,因为合并不会完全匹配。在这种情况下,您试图将第一个数据框与类#34; POSIXlt&#34;合并。使用第二个数据框&#34; POSIXct&#34;。它们不完全匹配,因为时区不同。

为什么它是POSIXct?因为在创建数据框时它被强制转换为该类。

为了解释记录的行为,我们可以将第一个数据框转换为&#34; POSIXct&#34;匹配,然后进行合并:

EURUSD0$Date <- as.POSIXct(EURUSD0$Date)
merge(EURUSD[1], EURUSD0, by="Date", all.x=T)
#                  Date   Open   High    Low  Close
# 1 2005-05-02 00:00:00 1.2861 1.2861 1.2861 1.2861
# 2 2005-05-02 00:01:00     NA     NA     NA     NA
# 3 2005-05-02 00:02:00     NA     NA     NA     NA
# 4 2005-05-02 00:03:00     NA     NA     NA     NA
# 5 2005-05-02 00:04:00 1.2860 1.2860 1.2860 1.2860
# 6 2005-05-02 00:05:00     NA     NA     NA     NA