40
40
is_list_like ,
41
41
is_timedelta64_dtype ,
42
42
)
43
+ from pandas .core .dtypes .generic import ABCExtensionArray
43
44
from pandas .core .dtypes .missing import array_equivalent
44
45
45
46
from pandas import (
54
55
concat ,
55
56
isna ,
56
57
)
57
- from pandas ._typing import FrameOrSeries
58
+ from pandas ._typing import ArrayLike , FrameOrSeries
58
59
from pandas .core .arrays .categorical import Categorical
59
60
import pandas .core .common as com
60
61
from pandas .core .computation .pytables import PyTablesExpr , maybe_expression
@@ -2960,7 +2961,7 @@ def read_index_node(
2960
2961
data = node [start :stop ]
2961
2962
# If the index was an empty array write_array_empty() will
2962
2963
# have written a sentinel. Here we relace it with the original.
2963
- if "shape" in node ._v_attrs and self . _is_empty_array (node ._v_attrs .shape ):
2964
+ if "shape" in node ._v_attrs and np . prod (node ._v_attrs .shape ) == 0 :
2964
2965
data = np .empty (node ._v_attrs .shape , dtype = node ._v_attrs .value_type ,)
2965
2966
kind = _ensure_decoded (node ._v_attrs .kind )
2966
2967
name = None
@@ -3006,25 +3007,27 @@ def read_index_node(
3006
3007
3007
3008
return index
3008
3009
3009
- def write_array_empty (self , key : str , value ):
3010
+ def write_array_empty (self , key : str , value : ArrayLike ):
3010
3011
""" write a 0-len array """
3011
3012
3012
3013
# ugly hack for length 0 axes
3013
3014
arr = np .empty ((1 ,) * value .ndim )
3014
3015
self ._handle .create_array (self .group , key , arr )
3015
- getattr (self .group , key )._v_attrs .value_type = str (value .dtype )
3016
- getattr (self .group , key )._v_attrs .shape = value .shape
3016
+ node = getattr (self .group , key )
3017
+ node ._v_attrs .value_type = str (value .dtype )
3018
+ node ._v_attrs .shape = value .shape
3017
3019
3018
- def _is_empty_array (self , shape ) -> bool :
3019
- """Returns true if any axis is zero length."""
3020
- return any (x == 0 for x in shape )
3020
+ def write_array (self , key : str , value : ArrayLike , items : Optional [Index ] = None ):
3021
+ # TODO: we only have one test that gets here, the only EA
3022
+ # that gets passed is DatetimeArray, and we never have
3023
+ # both self._filters and EA
3024
+ assert isinstance (value , (np .ndarray , ABCExtensionArray )), type (value )
3021
3025
3022
- def write_array (self , key : str , value , items = None ):
3023
3026
if key in self .group :
3024
3027
self ._handle .remove_node (self .group , key )
3025
3028
3026
3029
# Transform needed to interface with pytables row/col notation
3027
- empty_array = self . _is_empty_array ( value .shape )
3030
+ empty_array = value .size == 0
3028
3031
transposed = False
3029
3032
3030
3033
if is_categorical_dtype (value ):
@@ -3039,29 +3042,29 @@ def write_array(self, key: str, value, items=None):
3039
3042
value = value .T
3040
3043
transposed = True
3041
3044
3045
+ atom = None
3042
3046
if self ._filters is not None :
3043
- atom = None
3044
3047
try :
3045
3048
# get the atom for this datatype
3046
3049
atom = _tables ().Atom .from_dtype (value .dtype )
3047
3050
except ValueError :
3048
3051
pass
3049
3052
3050
- if atom is not None :
3051
- # create an empty chunked array and fill it from value
3052
- if not empty_array :
3053
- ca = self ._handle .create_carray (
3054
- self .group , key , atom , value .shape , filters = self ._filters
3055
- )
3056
- ca [:] = value
3057
- getattr (self .group , key )._v_attrs .transposed = transposed
3053
+ if atom is not None :
3054
+ # We only get here if self._filters is non-None and
3055
+ # the Atom.from_dtype call succeeded
3058
3056
3059
- else :
3060
- self .write_array_empty (key , value )
3057
+ # create an empty chunked array and fill it from value
3058
+ if not empty_array :
3059
+ ca = self ._handle .create_carray (
3060
+ self .group , key , atom , value .shape , filters = self ._filters
3061
+ )
3062
+ ca [:] = value
3061
3063
3062
- return
3064
+ else :
3065
+ self .write_array_empty (key , value )
3063
3066
3064
- if value .dtype .type == np .object_ :
3067
+ elif value .dtype .type == np .object_ :
3065
3068
3066
3069
# infer the type, warn if we have a non-string type here (for
3067
3070
# performance)
@@ -3071,35 +3074,30 @@ def write_array(self, key: str, value, items=None):
3071
3074
elif inferred_type == "string" :
3072
3075
pass
3073
3076
else :
3074
- try :
3075
- items = list (items )
3076
- except TypeError :
3077
- pass
3078
3077
ws = performance_doc % (inferred_type , key , items )
3079
3078
warnings .warn (ws , PerformanceWarning , stacklevel = 7 )
3080
3079
3081
3080
vlarr = self ._handle .create_vlarray (self .group , key , _tables ().ObjectAtom ())
3082
3081
vlarr .append (value )
3082
+
3083
+ elif empty_array :
3084
+ self .write_array_empty (key , value )
3085
+ elif is_datetime64_dtype (value .dtype ):
3086
+ self ._handle .create_array (self .group , key , value .view ("i8" ))
3087
+ getattr (self .group , key )._v_attrs .value_type = "datetime64"
3088
+ elif is_datetime64tz_dtype (value .dtype ):
3089
+ # store as UTC
3090
+ # with a zone
3091
+ self ._handle .create_array (self .group , key , value .asi8 )
3092
+
3093
+ node = getattr (self .group , key )
3094
+ node ._v_attrs .tz = _get_tz (value .tz )
3095
+ node ._v_attrs .value_type = "datetime64"
3096
+ elif is_timedelta64_dtype (value .dtype ):
3097
+ self ._handle .create_array (self .group , key , value .view ("i8" ))
3098
+ getattr (self .group , key )._v_attrs .value_type = "timedelta64"
3083
3099
else :
3084
- if empty_array :
3085
- self .write_array_empty (key , value )
3086
- else :
3087
- if is_datetime64_dtype (value .dtype ):
3088
- self ._handle .create_array (self .group , key , value .view ("i8" ))
3089
- getattr (self .group , key )._v_attrs .value_type = "datetime64"
3090
- elif is_datetime64tz_dtype (value .dtype ):
3091
- # store as UTC
3092
- # with a zone
3093
- self ._handle .create_array (self .group , key , value .asi8 )
3094
-
3095
- node = getattr (self .group , key )
3096
- node ._v_attrs .tz = _get_tz (value .tz )
3097
- node ._v_attrs .value_type = "datetime64"
3098
- elif is_timedelta64_dtype (value .dtype ):
3099
- self ._handle .create_array (self .group , key , value .view ("i8" ))
3100
- getattr (self .group , key )._v_attrs .value_type = "timedelta64"
3101
- else :
3102
- self ._handle .create_array (self .group , key , value )
3100
+ self ._handle .create_array (self .group , key , value )
3103
3101
3104
3102
getattr (self .group , key )._v_attrs .transposed = transposed
3105
3103
0 commit comments