@@ -2165,7 +2165,7 @@ def should_store(self, value):
21652165
21662166
21672167class DatetimeLikeBlockMixin (object ):
2168- """Mixin class for DatetimeBlock and DatetimeTZBlock ."""
2168+ """Mixin class for DatetimeBlock, DatetimeTZBlock, and TimedeltaBlock ."""
21692169
21702170 @property
21712171 def _holder (self ):
@@ -2857,15 +2857,17 @@ def to_native_types(self, slicer=None, na_rep=None, date_format=None,
28572857 """ convert to our native types format, slicing if desired """
28582858
28592859 values = self .values
2860+ i8values = self .values .view ('i8' )
2861+
28602862 if slicer is not None :
2861- values = values [..., slicer ]
2863+ i8values = i8values [..., slicer ]
28622864
28632865 from pandas .io .formats .format import _get_format_datetime64_from_values
28642866 format = _get_format_datetime64_from_values (values , date_format )
28652867
28662868 result = tslib .format_array_from_datetime (
2867- values . view ( 'i8' ) .ravel (), tz = getattr (self .values , 'tz' , None ),
2868- format = format , na_rep = na_rep ).reshape (values .shape )
2869+ i8values .ravel (), tz = getattr (self .values , 'tz' , None ),
2870+ format = format , na_rep = na_rep ).reshape (i8values .shape )
28692871 return np .atleast_2d (result )
28702872
28712873 def should_store (self , value ):
@@ -3115,8 +3117,16 @@ def get_block_type(values, dtype=None):
31153117 dtype = dtype or values .dtype
31163118 vtype = dtype .type
31173119
3118- if is_categorical (values ):
3120+ if is_sparse (dtype ):
3121+ # Need this first(ish) so that Sparse[datetime] is sparse
3122+ cls = ExtensionBlock
3123+ elif is_categorical (values ):
31193124 cls = CategoricalBlock
3125+ elif issubclass (vtype , np .datetime64 ):
3126+ assert not is_datetime64tz_dtype (values )
3127+ cls = DatetimeBlock
3128+ elif is_datetime64tz_dtype (values ):
3129+ cls = DatetimeTZBlock
31203130 elif is_interval_dtype (dtype ) or is_period_dtype (dtype ):
31213131 cls = ObjectValuesExtensionBlock
31223132 elif is_extension_array_dtype (values ):
@@ -3128,11 +3138,6 @@ def get_block_type(values, dtype=None):
31283138 cls = TimeDeltaBlock
31293139 elif issubclass (vtype , np .complexfloating ):
31303140 cls = ComplexBlock
3131- elif issubclass (vtype , np .datetime64 ):
3132- assert not is_datetime64tz_dtype (values )
3133- cls = DatetimeBlock
3134- elif is_datetime64tz_dtype (values ):
3135- cls = DatetimeTZBlock
31363141 elif issubclass (vtype , np .integer ):
31373142 cls = IntBlock
31383143 elif dtype == np .bool_ :
0 commit comments