@@ -359,13 +359,13 @@ def _read_block_manager(self, group):
359
359
360
360
axes = []
361
361
for i in xrange (ndim ):
362
- ax = _read_index (group , 'axis%d' % i )
362
+ ax = self . _read_index (group , 'axis%d' % i )
363
363
axes .append (ax )
364
364
365
365
items = axes [0 ]
366
366
blocks = []
367
367
for i in range (group ._v_attrs .nblocks ):
368
- blk_items = _read_index (group , 'block%d_items' % i )
368
+ blk_items = self . _read_index (group , 'block%d_items' % i )
369
369
values = _read_array (group , 'block%d_values' % i )
370
370
blk = make_block (values , blk_items , items )
371
371
blocks .append (blk )
@@ -410,9 +410,9 @@ def _write_long(self, group, panel, append=False):
410
410
def _read_long (self , group , where = None ):
411
411
from pandas .core .index import MultiIndex
412
412
413
- items = _read_index (group , 'items' )
414
- major_axis = _read_index (group , 'major_axis' )
415
- minor_axis = _read_index (group , 'minor_axis' )
413
+ items = self . _read_index (group , 'items' )
414
+ major_axis = self . _read_index (group , 'major_axis' )
415
+ minor_axis = self . _read_index (group , 'minor_axis' )
416
416
major_labels = _read_array (group , 'major_labels' )
417
417
minor_labels = _read_array (group , 'minor_labels' )
418
418
values = _read_array (group , 'values' )
@@ -421,12 +421,80 @@ def _read_long(self, group, where=None):
421
421
labels = [major_labels , minor_labels ])
422
422
return LongPanel (values , index = index , columns = items )
423
423
424
- def _write_index (self , group , key , value ):
425
- # don't care about type here
426
- converted , kind , _ = _convert_index (value )
427
- self ._write_array (group , key , converted )
428
- node = getattr (group , key )
429
- node ._v_attrs .kind = kind
424
+ def _write_index (self , group , key , index ):
425
+ if isinstance (index , MultiIndex ):
426
+ setattr (group ._v_attrs , '%s_variety' % key , 'multi' )
427
+ self ._write_multi_index (group , key , index )
428
+ else :
429
+ setattr (group ._v_attrs , '%s_variety' % key , 'regular' )
430
+ converted , kind , _ = _convert_index (index )
431
+ self ._write_array (group , key , converted )
432
+ node = getattr (group , key )
433
+ node ._v_attrs .kind = kind
434
+
435
+ def _read_index (self , group , key ):
436
+ try :
437
+ variety = getattr (group ._v_attrs , '%s_variety' % key )
438
+ except Exception :
439
+ variety = 'regular'
440
+
441
+ if variety == 'multi' :
442
+ return self ._read_multi_index (group , key )
443
+ elif variety == 'regular' :
444
+ _ , index = self ._read_index_node (getattr (group , key ))
445
+ return index
446
+ else :
447
+ raise Exception ('unrecognized index variety' )
448
+
449
+ def _write_multi_index (self , group , key , index ):
450
+ setattr (group ._v_attrs , '%s_nlevels' % key , index .nlevels )
451
+
452
+ for i , (lev , lab , name ) in enumerate (zip (index .levels ,
453
+ index .labels ,
454
+ index .names )):
455
+ # write the level
456
+ conv_level , kind , _ = _convert_index (lev )
457
+ level_key = '%s_level%d' % (key , i )
458
+ self ._write_array (group , level_key , conv_level )
459
+ node = getattr (group , level_key )
460
+ node ._v_attrs .kind = kind
461
+ node ._v_attrs .name = name
462
+
463
+ # write the name
464
+ setattr (node ._v_attrs , '%s_name%d' % (key , i ), name )
465
+
466
+ # write the labels
467
+ label_key = '%s_label%d' % (key , i )
468
+ self ._write_array (group , label_key , lab )
469
+
470
+ def _read_multi_index (self , group , key ):
471
+ nlevels = getattr (group ._v_attrs , '%s_nlevels' % key )
472
+
473
+ levels = []
474
+ labels = []
475
+ names = []
476
+ for i in range (nlevels ):
477
+ level_key = '%s_level%d' % (key , i )
478
+ name , lev = self ._read_index_node (getattr (group , level_key ))
479
+ levels .append (lev )
480
+ names .append (name )
481
+
482
+ label_key = '%s_label%d' % (key , i )
483
+ lab = getattr (group , label_key )[:]
484
+ labels .append (lab )
485
+
486
+ return MultiIndex (levels = levels , labels = labels , names = names )
487
+
488
+ def _read_index_node (self , node ):
489
+ data = node [:]
490
+ kind = node ._v_attrs .kind
491
+
492
+ try :
493
+ name = node ._v_attrs .name
494
+ except Exception :
495
+ name = None
496
+
497
+ return name , _unconvert_index (data , kind )
430
498
431
499
def _write_array (self , group , key , value ):
432
500
if key in group :
@@ -531,21 +599,28 @@ def _read_group(self, group, where=None):
531
599
return handler (group , where )
532
600
533
601
def _read_series (self , group , where = None ):
534
- index = _read_index (group , 'index' )
602
+ index = self . _read_index (group , 'index' )
535
603
values = _read_array (group , 'values' )
536
604
return Series (values , index = index )
537
605
538
606
def _read_legacy_series (self , group , where = None ):
539
- index = _read_index_legacy (group , 'index' )
607
+ index = self . _read_index_legacy (group , 'index' )
540
608
values = _read_array (group , 'values' )
541
609
return Series (values , index = index )
542
610
543
611
def _read_legacy_frame (self , group , where = None ):
544
- index = _read_index_legacy (group , 'index' )
545
- columns = _read_index_legacy (group , 'columns' )
612
+ index = self . _read_index_legacy (group , 'index' )
613
+ columns = self . _read_index_legacy (group , 'columns' )
546
614
values = _read_array (group , 'values' )
547
615
return DataFrame (values , index = index , columns = columns )
548
616
617
+ def _read_index_legacy (self , group , key ):
618
+ node = getattr (group , key )
619
+ data = node [:]
620
+ kind = node ._v_attrs .kind
621
+
622
+ return _unconvert_index_legacy (data , kind )
623
+
549
624
def _read_frame_table (self , group , where = None ):
550
625
return self ._read_panel_table (group , where )['value' ]
551
626
@@ -618,13 +693,6 @@ def _read_array(group, key):
618
693
else :
619
694
return data
620
695
621
- def _read_index (group , key ):
622
- node = getattr (group , key )
623
- data = node [:]
624
- kind = node ._v_attrs .kind
625
-
626
- return _unconvert_index (data , kind )
627
-
628
696
def _unconvert_index (data , kind ):
629
697
if kind == 'datetime' :
630
698
index = np .array ([datetime .fromtimestamp (v ) for v in data ],
@@ -635,13 +703,6 @@ def _unconvert_index(data, kind):
635
703
raise ValueError ('unrecognized index type %s' % kind )
636
704
return index
637
705
638
- def _read_index_legacy (group , key ):
639
- node = getattr (group , key )
640
- data = node [:]
641
- kind = node ._v_attrs .kind
642
-
643
- return _unconvert_index_legacy (data , kind )
644
-
645
706
def _unconvert_index_legacy (data , kind , legacy = False ):
646
707
if kind == 'datetime' :
647
708
index = _tseries .array_to_datetime (data )
0 commit comments