0

Let's say that my data has the following structure

library(xts)

structure(c(-0.108511, -0.446626999999999, 0.240643000000002, 
1.679788, -2.278705, 0.0174959999999977, -0.23011, -1.458079, 
-0.770809, -0.160931000000001, -0.884409000000002, -0.127797999999999, 
0.231928, -0.125263, -0.188977999999999, -0.343629999999997, 
-0.333669, 0.168738999999999, 1.249041, -1.41732, 0.0101289999999992, 
-0.434269, -1.328651, -0.810048999999999, -0.0380099999999999, 
0.0380099999999999, 0, 0, -0.0821299999999994, 0.0821299999999994, 
-0.0905709999999971, -0.626428000000001, 0.3538, 2.56579, -2.109532, 
0.0253410000000009, -0.243471, -1.732849, -0.921948999999998, 
-0.354142, -1.454579, 0.0786300000000004, 1.08839, -0.248750999999999, 
-0.975019000000001, -0.022001000000003, -0.474670999999997, 0.16667, 
1.165852, -4.200741, 0.0207899999999981, 0.0436310000000013, 
-1.246241, -0.48298, -0.0585299999999993, -2.37666, -0.73001, 
0.898570000000001, -0.295430000000001, -0.59243, -0.0217520000000029, 
-0.449507999999998, 0.164778999999999, 1.750981, -1.99885, 0.0310400000000008, 
-0.249700999999998, -1.548811, -0.839808999999999, -0.35397, 
-0.703519, 0.0034099999999988, -0.743641, 0, 0.602879999999999
), class = c("xts", "zoo"), index = structure(c(1246490100, 1246490400, 
1246490700, 1246491000, 1246491300, 1246491600, 1246491900, 1246492200, 
1246492800, 1246493100, 1246493400, 1246493700, 1246494000, 1246494300, 
1246494600), tzone = "UTC", tclass = c("POSIXct", "POSIXt")), .Dim = c(15L, 
5L), .Dimnames = list(NULL, c("rrp_nsw", "rrp_qld", "rrp_sa", 
"rrp_tas", "rrp_vic")))

The data above is a xts object, with this information i would like to create a list where the elements be the daily information. I would like to get the following output with the data presented.

Mylist[[`2009-07-01`]]

-0.108511 -0.343630 -0.090571 -0.022001 -0.021752
-0.446627 -0.333669 -0.626428 -0.474671 -0.449508
0.240643  0.168739  0.353800  0.166670  0.164779
1.679788  1.249041  2.565790  1.165852  1.750981
-2.278705 -1.417320 -2.109532 -4.200741 -1.998850
0.017496  0.010129  0.025341  0.020790  0.031040
-0.230110 -0.434269 -0.243471  0.043631 -0.249701
-1.458079 -1.328651 -1.732849 -1.246241 -1.548811

Mylist[[`2009-07-02`]]
-0.770809 -0.810049 -0.921949 -0.482980 -0.839809
-0.160931 -0.038010 -0.354142 -0.058530 -0.353970
-0.884409  0.038010 -1.454579 -2.376660 -0.703519
-0.127798  0.000000  0.078630 -0.730010  0.003410
0.231928  0.000000  1.088390  0.898570 -0.743641
-0.125263 -0.082130 -0.248751 -0.295430  0.000000
-0.188978  0.082130 -0.975019 -0.592430  0.602880
Eve Chanatasig
  • 397
  • 2
  • 10

1 Answers1

2

split.xts splits it into a list of xts objects.

A few points:

  1. It is also possible to use just "days" as the second argument of split but that will give a warning and also it will give an unnamed list rather than a named list. (options(xts_check_TZ = FALSE) can be used to eliminate the warning although that could affect other functions too.)
  2. The Date of a datetime depends on the time zone and defaults to UTC. For example, as.Date(time(x), tz = "") would give the Date that x is split by relative to the current time zone.
split(x, as.Date(time(x)))

giving:

$`2009-07-01`
                      rrp_nsw   rrp_qld    rrp_sa   rrp_tas   rrp_vic
2009-07-01 23:15:00 -0.108511 -0.343630 -0.090571 -0.022001 -0.021752
2009-07-01 23:20:00 -0.446627 -0.333669 -0.626428 -0.474671 -0.449508
2009-07-01 23:25:00  0.240643  0.168739  0.353800  0.166670  0.164779
2009-07-01 23:30:00  1.679788  1.249041  2.565790  1.165852  1.750981
2009-07-01 23:35:00 -2.278705 -1.417320 -2.109532 -4.200741 -1.998850
2009-07-01 23:40:00  0.017496  0.010129  0.025341  0.020790  0.031040
2009-07-01 23:45:00 -0.230110 -0.434269 -0.243471  0.043631 -0.249701
2009-07-01 23:50:00 -1.458079 -1.328651 -1.732849 -1.246241 -1.548811

$`2009-07-02`
                      rrp_nsw   rrp_qld    rrp_sa  rrp_tas   rrp_vic
2009-07-02 00:00:00 -0.770809 -0.810049 -0.921949 -0.48298 -0.839809
2009-07-02 00:05:00 -0.160931 -0.038010 -0.354142 -0.05853 -0.353970
2009-07-02 00:10:00 -0.884409  0.038010 -1.454579 -2.37666 -0.703519
2009-07-02 00:15:00 -0.127798  0.000000  0.078630 -0.73001  0.003410
2009-07-02 00:20:00  0.231928  0.000000  1.088390  0.89857 -0.743641
2009-07-02 00:25:00 -0.125263 -0.082130 -0.248751 -0.29543  0.000000
2009-07-02 00:30:00 -0.188978  0.082130 -0.975019 -0.59243  0.602880
G. Grothendieck
  • 254,981
  • 17
  • 203
  • 341
  • split(time_info, as.Date(time(time_info))) `Error in as.Date.numeric(time(time_info)) : 'origin' must be supplied`, then the same split(time_info, as.Date(time(time_info))) gives your `$ 2009-07-01` & etc. A little head scratch. – Chris Oct 06 '21 at 12:02
  • @Chris, If you want to work with xts objects you have to load the xts package first. Obviously the poster has this loaded or they would not have been able to create the xts object shown in the question. Also the question is tagged xts. – G. Grothendieck Oct 06 '21 at 12:09
  • Or, if you stumble on first try without xts, and then use `xts::split.xts(x`, xts is loaded via namespace, and `split(x` works fine thereafter... – Chris Oct 06 '21 at 12:27
  • @Chris. No. Don't do that. Load xts using a library statement. – G. Grothendieck Oct 06 '21 at 12:30