44
44
soft_convert_objects ,
45
45
maybe_convert_objects ,
46
46
astype_nansafe ,
47
- find_common_type )
47
+ find_common_type ,
48
+ maybe_infer_dtype_type )
48
49
from pandas .core .dtypes .missing import (
49
50
isna , notna , array_equivalent ,
50
51
_isna_compat ,
@@ -629,10 +630,9 @@ def convert(self, copy=True, **kwargs):
629
630
def _can_hold_element (self , element ):
630
631
""" require the same dtype as ourselves """
631
632
dtype = self .values .dtype .type
632
- if is_list_like (element ):
633
- element = np .asarray (element )
634
- tipo = element .dtype .type
635
- return issubclass (tipo , dtype )
633
+ tipo = maybe_infer_dtype_type (element )
634
+ if tipo is not None :
635
+ return issubclass (tipo .type , dtype )
636
636
return isinstance (element , dtype )
637
637
638
638
def _try_cast_result (self , result , dtype = None ):
@@ -1806,11 +1806,10 @@ class FloatBlock(FloatOrComplexBlock):
1806
1806
_downcast_dtype = 'int64'
1807
1807
1808
1808
def _can_hold_element (self , element ):
1809
- if is_list_like (element ):
1810
- element = np .asarray (element )
1811
- tipo = element .dtype .type
1812
- return (issubclass (tipo , (np .floating , np .integer )) and
1813
- not issubclass (tipo , (np .datetime64 , np .timedelta64 )))
1809
+ tipo = maybe_infer_dtype_type (element )
1810
+ if tipo is not None :
1811
+ return (issubclass (tipo .type , (np .floating , np .integer )) and
1812
+ not issubclass (tipo .type , (np .datetime64 , np .timedelta64 )))
1814
1813
return (isinstance (element , (float , int , np .floating , np .int_ )) and
1815
1814
not isinstance (element , (bool , np .bool_ , datetime , timedelta ,
1816
1815
np .datetime64 , np .timedelta64 )))
@@ -1856,9 +1855,9 @@ class ComplexBlock(FloatOrComplexBlock):
1856
1855
is_complex = True
1857
1856
1858
1857
def _can_hold_element (self , element ):
1859
- if is_list_like (element ):
1860
- element = np . array ( element )
1861
- return issubclass (element . dtype .type ,
1858
+ tipo = maybe_infer_dtype_type (element )
1859
+ if tipo is not None :
1860
+ return issubclass (tipo .type ,
1862
1861
(np .floating , np .integer , np .complexfloating ))
1863
1862
return (isinstance (element ,
1864
1863
(float , int , complex , np .float_ , np .int_ )) and
@@ -1874,12 +1873,12 @@ class IntBlock(NumericBlock):
1874
1873
_can_hold_na = False
1875
1874
1876
1875
def _can_hold_element (self , element ):
1877
- if is_list_like (element ):
1878
- element = np . array ( element )
1879
- tipo = element . dtype . type
1880
- return ( issubclass (tipo , np .integer ) and
1881
- not issubclass ( tipo , ( np . datetime64 , np .timedelta64 )) and
1882
- self .dtype .itemsize >= element . dtype .itemsize )
1876
+ tipo = maybe_infer_dtype_type (element )
1877
+ if tipo is not None :
1878
+ return ( issubclass ( tipo . type , np . integer ) and
1879
+ not issubclass (tipo . type , ( np .datetime64 ,
1880
+ np .timedelta64 )) and
1881
+ self .dtype .itemsize >= tipo .itemsize )
1883
1882
return is_integer (element )
1884
1883
1885
1884
def should_store (self , value ):
@@ -1917,10 +1916,9 @@ def _box_func(self):
1917
1916
return lambda x : tslib .Timedelta (x , unit = 'ns' )
1918
1917
1919
1918
def _can_hold_element (self , element ):
1920
- if is_list_like (element ):
1921
- element = np .array (element )
1922
- tipo = element .dtype .type
1923
- return issubclass (tipo , np .timedelta64 )
1919
+ tipo = maybe_infer_dtype_type (element )
1920
+ if tipo is not None :
1921
+ return issubclass (tipo .type , np .timedelta64 )
1924
1922
return isinstance (element , (timedelta , np .timedelta64 ))
1925
1923
1926
1924
def fillna (self , value , ** kwargs ):
@@ -2018,9 +2016,9 @@ class BoolBlock(NumericBlock):
2018
2016
_can_hold_na = False
2019
2017
2020
2018
def _can_hold_element (self , element ):
2021
- if is_list_like (element ):
2022
- element = np . asarray ( element )
2023
- return issubclass (element . dtype .type , np .bool_ )
2019
+ tipo = maybe_infer_dtype_type (element )
2020
+ if tipo is not None :
2021
+ return issubclass (tipo .type , np .bool_ )
2024
2022
return isinstance (element , (bool , np .bool_ ))
2025
2023
2026
2024
def should_store (self , value ):
@@ -2450,7 +2448,9 @@ def _astype(self, dtype, mgr=None, **kwargs):
2450
2448
return super (DatetimeBlock , self )._astype (dtype = dtype , ** kwargs )
2451
2449
2452
2450
def _can_hold_element (self , element ):
2453
- if is_list_like (element ):
2451
+ tipo = maybe_infer_dtype_type (element )
2452
+ if tipo is not None :
2453
+ # TODO: this still uses asarray, instead of dtype.type
2454
2454
element = np .array (element )
2455
2455
return element .dtype == _NS_DTYPE or element .dtype == np .int64
2456
2456
return (is_integer (element ) or isinstance (element , datetime ) or
0 commit comments