Question

I want to convert a data.frame to a zoo object. My df looks like that:

> (str(StockPriceReturns))
'data.frame':   3036 obs. of  2 variables:
 $ Date        : Factor w/ 3036 levels "01.01.2002","01.01.2003",..: 1 102 202 301 600 701 802 902 1001 1300 ...
 $ TotalReturns: num  183 183 186 191 191 ...
NULL

What I tried:

directly:

Here I am getting an error...

> (z1 <- read.zoo(StockPriceReturns, drop=FALSE))
Error in read.zoo(StockPriceReturns, drop = FALSE) : 
  index has 3036 bad entries at data rows: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 ...

function:

I am getting an error too ;(

    dfToZoo <- function(df) {
        require(zoo)
        date <- as.Date(df[, 1], format = '%d.%m.%y')
        with(df, zoo(date,freq))
    } 

> (z1 <- dfToZoo(StockPriceReturns))
Error in MATCH(order.by, order.by) : object 'freq' not found

My question is what is a better way to convert a data.frame to a zoo object? How to properly do that?

I appreciate your reply

Was it helpful?

Solution

Regarding the attempt to use read.zoo, the format of the first column must be specified as it differs from the default. See ?read.zoo for proper use of that function. Also there is a vignette vignette("zoo-read") entirely devoted to read.zoo examples.

DF <- data.frame(Date = c("01.01.2002","01.01.2003"), TotalReturns = c(183, 183))
library(zoo)
read.zoo(DF, format = "%d.%m.%Y")
## 2002-01-01 2003-01-01 
##        183        183 

The function dfToZoo provided in the question uses zoo incorrectly (see ?zoo to understand the arguments) and the value of the format argument should be "%d.%m.%Y" with an upper case Y.

OTHER TIPS

A quick take on a dfTozoo function. It gives you the flexibility of specifying the date format if different from the included default:

dfTozoo = function(tsdataframe, dateformat="%m/%d/%Y"){

  library(zoo)

  framedates = as.Date(tsdataframe[,1], format=dateformat)
  n=ncol(tsdataframe)
  zoodata = zoo(tsdataframe[,2:n], order.by=framedates)

  return(zoodata)
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top