R将POSIXlt转换为xts

时间:2013-11-25 12:40:20

标签: r dataframe time-series xts

我有以下格式的时间序列:

> str(Y$Date)
POSIXlt[1:174110], format: "2001-01-01 12:00:00" "2001-01-01 05:30:00" "2001-01-02 01:30:00" "2001-01-02 02:00:00" "2001-01-02 02:00:00" "2001-01-02 02:01:00" "2001-01-02 04:00:00" "2001-01-02 04:00:00" ...

> summary(Y$Date)
                 Min.               1st Qu.                Median                  Mean               3rd Qu.                  Max. 
"2001-01-01 05:30:00" "2004-03-15 10:40:30" "2007-01-03 04:00:00" "2006-11-11 15:53:11" "2009-08-13 12:00:00" "2011-12-30 12:30:00" 

> length(Y$Date)
[1] 174110

我需要转换为xts格式。为此,我做了以下工作:

date <- Y$Date
date <- as.xts(date)
> xtsible(date) #tests wheather or not the data is convertibal to format xts
[1] TRUE

然而:

> str(date)
An 'xts' object of zero-width
> length(date)
[1] 0

> head(date['2001'])
                    [,1]
2001-01-01 05:30:00   NA
2001-01-01 12:00:00   NA
2001-01-02 01:30:00   NA
2001-01-02 02:00:00   NA
2001-01-02 02:00:00   NA
2001-01-02 02:00:00   NA

并将数据恢复到数据框中:

> Y$date <- date
Error in `$<-.data.frame`(`*tmp*`, "date", value = numeric(0)) : 
  replacement has 0 rows, data has 174110

> as.data.frame(date)
Error in data.frame(`coredata(x)` = c(NA_character_, NA_character_, NA_character_,  : 
   duplicate row.names: 2001-01-02 02:00:00, ... , 2001-01-08 06:00:00, 200
In addition: Warning message:
In format.data.frame(x, digits = digits, na.encode = FALSE) :
  corrupt data frame: columns will be truncated or padded with NAs

> str(Y)
'data.frame':   174110 obs. of  17 variables:
 $ Date    : POSIXlt, format: "2001-01-01 12:00:00" "2001-01-01 05:30:00" "2001-01-02 01:30:00" "2001-01-02 02:00:00" ...
 $ C       : chr  "MA" "IN" "SI" "ID" ...
 $ Event   : chr  "MALAY VEHICLE SALES" "Interbank Offer Rate - Percent" "Advance GDP Estimate (YoY)" "Foreign Reserves" ...
 $ News    : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Growth  : num  148 NA 0.3 387.2 0 ...
 $ Surv.M  : num  NA NA NA NA NA NA NA NA NA NA ...
 $ Act     : num  30892 NA 10.5 29281.4 12500 ...
 $ Prior   : num  30744 8100 10.2 28894.2 12500 ...
 $ Revised : num  NA NA NA NA NA ...
 $ Type    : chr  NA NA "%" "$B" ...
 $ Freq.   : chr  "M" "NA" "Q" "M" ...
 $ Ticker  : chr  "MAVSTTL Index" "IMIBOR Index" "SGAVYOY% Index" "IDGFA Index" ...
 $ Period  : chr  "Nov" "12/31/13" "4Q" "Dec" ...
 $ Category: chr  "NA" "NA" "NA" "NA" ...
 $ Time    : chr  "12:00:00 AM" "05:30:00 AM" "01:30:00 AM" "02:00:00 AM" ...
 $ Country : chr  "Malaysia" "India" "Singapore" "Indonesia" ...
 $ date    : POSIXlt, format: "2001-01-01 12:00:00" "2001-01-01 05:30:00" "2001-01-02 01:30:00" "2001-01-02 02:00:00" ...

我不知道为什么我无法将数据正确地转换为xts格式,然后将它们恢复到数据框中。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我之前已经回答了你提出的类似问题。我想这引起了一些混乱。当您看到?xts时,它会说xts会创建一个“可扩展的时间序列”对象。首先,我们必须指定x,必须指定时间序列的对象,然后指定索引,即时间序列本身(在您的情况下为Y$Date)。

这是一个简化的解决方案:

Y_new <- xts(x = Y[,-1], order.by = Y$Date]

这会以时间序列格式创建一个新对象Y_new,其中包含Y的所有数据,并且可以轻松选择所需的时间间隔。