@@ -1887,65 +1887,63 @@ def _maybe_box_datetimelike(value):
18871887
18881888_values_from_object = lib .values_from_object
18891889
1890- def _possibly_convert_objects (values , convert_dates = True ,
1891- convert_numeric = True ,
1892- convert_timedeltas = True ):
1890+
1891+ def _possibly_convert_objects (values ,
1892+ datetime = True ,
1893+ numeric = True ,
1894+ timedelta = True ,
1895+ coerce = False ):
18931896 """ if we have an object dtype, try to coerce dates and/or numbers """
18941897
1895- # if we have passed in a list or scalar
1898+ conversion_count = sum ((datetime , numeric , timedelta ))
1899+ if conversion_count == 0 :
1900+ import warnings
1901+ warnings .warn ('Must explicitly pass type for conversion. Original '
1902+ 'value returned.' , RuntimeWarning )
1903+ return values
1904+
18961905 if isinstance (values , (list , tuple )):
1906+ # List or scalar
18971907 values = np .array (values , dtype = np .object_ )
1898- if not hasattr (values , 'dtype' ):
1908+ elif not hasattr (values , 'dtype' ):
18991909 values = np .array ([values ], dtype = np .object_ )
1900-
1901- # convert dates
1902- if convert_dates and values .dtype == np .object_ :
1903-
1904- # we take an aggressive stance and convert to datetime64[ns]
1905- if convert_dates == 'coerce' :
1906- new_values = _possibly_cast_to_datetime (
1907- values , 'M8[ns]' , coerce = True )
1908-
1909- # if we are all nans then leave me alone
1910- if not isnull (new_values ).all ():
1911- values = new_values
1912-
1913- else :
1914- values = lib .maybe_convert_objects (
1915- values , convert_datetime = convert_dates )
1916-
1917- # convert timedeltas
1918- if convert_timedeltas and values .dtype == np .object_ :
1919-
1920- if convert_timedeltas == 'coerce' :
1921- from pandas .tseries .timedeltas import to_timedelta
1922- values = to_timedelta (values , coerce = True )
1923-
1924- # if we are all nans then leave me alone
1925- if not isnull (new_values ).all ():
1926- values = new_values
1927-
1928- else :
1929- values = lib .maybe_convert_objects (
1930- values , convert_timedelta = convert_timedeltas )
1931-
1932- # convert to numeric
1933- if values .dtype == np .object_ :
1934- if convert_numeric :
1935- try :
1936- new_values = lib .maybe_convert_numeric (
1937- values , set (), coerce_numeric = True )
1938-
1939- # if we are all nans then leave me alone
1940- if not isnull (new_values ).all ():
1941- values = new_values
1942-
1943- except :
1944- pass
1945- else :
1946-
1947- # soft-conversion
1948- values = lib .maybe_convert_objects (values )
1910+ elif not is_object_dtype (values .dtype ):
1911+ # If not object, do not attempt conversion
1912+ return values
1913+
1914+ # If 1 flag is coerce, ensure 2 others are False
1915+ if coerce :
1916+ if conversion_count > 1 :
1917+ raise ValueError ("Only one of 'datetime', 'numeric' or "
1918+ "'timedelta' can be True when when coerce=True." )
1919+
1920+ # Immediate return if coerce
1921+ if datetime :
1922+ return pd .to_datetime (values , coerce = True , box = False )
1923+ elif timedelta :
1924+ return pd .to_timedelta (values , coerce = True , box = False )
1925+ elif numeric :
1926+ return lib .maybe_convert_numeric (values , set (), coerce_numeric = True )
1927+
1928+ # Soft conversions
1929+ if datetime :
1930+ values = lib .maybe_convert_objects (values ,
1931+ convert_datetime = datetime )
1932+
1933+ if timedelta and is_object_dtype (values .dtype ):
1934+ # Object check to ensure only run if previous did not convert
1935+ values = lib .maybe_convert_objects (values ,
1936+ convert_timedelta = timedelta )
1937+
1938+ if numeric and is_object_dtype (values .dtype ):
1939+ try :
1940+ converted = lib .maybe_convert_numeric (values ,
1941+ set (),
1942+ coerce_numeric = True )
1943+ # If all NaNs, then do not-alter
1944+ values = converted if not isnull (converted ).all () else values
1945+ except :
1946+ pass
19491947
19501948 return values
19511949
0 commit comments