2

quick question on tick data. I have tons of data under this format which I believe is perfect for what I'm trying to achieve. I want to keep some granularity in order to be able to trigger buy/sell signal under a second.

data

       SYMBOL  TIMESTAMP            STAMP   PRICE  SIZE EXCHANGE   BID BIDEX BIDSIZE   ASK ASKEX ASKSIZE
1        SPXU 1330938005 1330938005000000      NA    NA       9.99   PSE       5 10.10   PSE       6
2        SPXU 1330938221 1330938221000000      NA    NA       9.99   PSE       5 10.19   PSE       1
3        SPXU 1330938221 1330938221000001 10.1000   600      PSE    NA        NA    NA        NA
4        SPXU 1330938392 1330938392000000      NA    NA      10.00   PSE     174 10.19   PSE       1
5        SPXU 1330938431 1330938431000000      NA    NA      10.00   PSE     175 10.19   PSE       1
6        SPXU 1330938468 1330938468000000      NA    NA      10.00   PSE       1 10.19   PSE       1
7        SPXU 1330938736 1330938736000000      NA    NA      10.04   PSE      46 10.19   PSE       1
8        SPXU 1330938843 1330938843000000      NA    NA      10.04   PSE      47 10.19   PSE       1
9        SPXU 1330939576 1330939576000000      NA    NA      10.04   PSE       1 10.19   PSE       1
10       SPXU 1330939615 1330939615000000      NA    NA      10.05   PSE     100 10.19   PSE       1
11       SPXU 1330939615 1330939615000001      NA    NA      10.05   PSE     100 10.19   PSE     101
12       SPXU 1330939621 1330939621000000      NA    NA      10.04   PSE       1 10.19   PSE     101
13       SPXU 1330939621 1330939621000001      NA    NA      10.04   PSE       1 10.19   PSE       1
14       SPXU 1330939623 1330939623000000      NA    NA      10.05   PSE      46 10.19   PSE       1
15       SPXU 1330939623 1330939623000001      NA    NA      10.05   PSE      46 10.18   PSE      46
16       SPXU 1330939638 1330939638000000      NA    NA      10.04   PSE       1 10.18   PSE      46
17       SPXU 1330939686 1330939686000000      NA    NA      10.04   PSE       1 10.19   PSE       1
18       SPXU 1330939825 1330939825000000      NA    NA      10.05   PSE     100 10.19   PSE       1
19       SPXU 1330939825 1330939825000001      NA    NA      10.05   PSE     100 10.19   PSE     101
20       SPXU 1330939833 1330939833000000      NA    NA      10.04   PSE       1 10.19   PSE     101
21       SPXU 1330939833 1330939833000001      NA    NA      10.04   PSE       1 10.19   PSE       1
22       SPXU 1330939833 1330939833000002      NA    NA      10.04   PSE     101 10.19   PSE       1
23       SPXU 1330939833 1330939833000003      NA    NA      10.04   PSE     101 10.19   PSE     101
24       SPXU 1330939941 1330939941000000      NA    NA      10.04   PSE     101 10.19   PSE     102
25       SPXU 1330940041 1330940041000000      NA    NA      10.04   PSE       1 10.19   PSE     102

I want to be able to have zoo objects created keeping the millisecond granularity. I'm unable to transform the "data$STAMP" into a date. How can I do this?

working:

> as.POSIXlt(data2$TIMESTAMP[3], origin="1970-01-01", tz="EST")
[1] "2012-03-05 04:01:36 EST"

not working:

> as.POSIXlt(data2$STAMP[3], origin="1970-01-01", tz="EST")
[1] "))0'-06-03 15:45:52 EST"
Kara
  • 6,115
  • 16
  • 50
  • 57
Yannick
  • 3,426
  • 1
  • 12
  • 6

1 Answers1

2

That's essentially a FAQ -- you need options("digits.secs"=6) to default to displaying sub-second time information.

Witness:

R> Sys.time()                    # using defaults: no milli or micros
[1] "2012-07-15 12:51:17 CDT"
R> options("digits.secs"=6)      # changing defaults: presto!
R> Sys.time()
[1] "2012-07-15 12:51:30.218308 CDT"
R> 

Now combine this with suitable numeric vector, suitably converted to R's datetime types:

R> vec <- 1330938005000000 + cumsum(runif(1:5)*10)
R> vec
[1] 1.331e+15 1.331e+15 1.331e+15 1.331e+15 1.331e+15
R> as.POSIXct(vec/1e6, origin="1970-01-01")
[1] "2012-03-05 09:00:05.000004 CST"
[2] "2012-03-05 09:00:05.000006 CST"
[3] "2012-03-05 09:00:05.000016 CST"
[4] "2012-03-05 09:00:05.000021 CST"
[5] "2012-03-05 09:00:05.000029 CST"
R> 
Dirk Eddelbuettel
  • 360,940
  • 56
  • 644
  • 725
  • Tried this.. still not able to format from a numeric...:> options("digits.secs"=6) > as.POSIXlt(data2$STAMP[3], origin="1970-01-01", tz="EST") [1] "))0'-06-03 15:45:52 EST" > – Yannick Jul 15 '12 at 18:05
  • The see my edited answer. If that doesn't help, supply more detail about what you tried and what failed. – Dirk Eddelbuettel Jul 15 '12 at 18:08
  • seems to work, one last thing, any idea why it display the wrong tz?`/plugins# date -d @1330938005 Mon Mar 5 04:00:05 EST 2012 > as.POSIXct(data$STAMP[1]/1e6, origin="1970-01-01", tz="EST") [1] "2012-03-05 09:00:05 EST" > as.POSIXct(data$TIMESTAMP[1], origin="1970-01-01", tz="EST") [1] "2012-03-05 09:00:05 EST" > as.POSIXct(1330938005, origin="1970-01-01", tz="EST") [1] "2012-03-05 09:00:05 EST" ` – Yannick Jul 15 '12 at 18:28
  • +1 Dirk, I'd call it a known gotcha of *`zoo`* (or anything else requiring 4dps). The first time I saw it it took me the best part of an hour to self-diagnose and fix. – smci Jul 15 '12 at 20:13
  • Not zoo per se---it's a "bad default" as far as printing of POSIXt object goes. Using zoo merely makes us notice this. – Dirk Eddelbuettel Jul 15 '12 at 20:23
  • `> as.POSIXct(1330938005, origin="1970-01-01", tz="EST") [1] "2012-03-05 09:00:05 EST" > as.POSIXlt(1330938005, origin="1970-01-01", tz="EST") [1] "2012-03-05 04:00:05 EST"` – Yannick Jul 15 '12 at 22:46
  • 1
    http://stackoverflow.com/questions/2457129/converting-unix-seconds-in-milliseconds-to-posixct-posixlt – Yannick Jul 15 '12 at 22:47