@@ -236,40 +236,41 @@ def _convert_listlike_datetimes(arg, box, format, name=None, tz=None,
236236 require_iso8601 = not infer_datetime_format
237237 format = None
238238
239- try :
240- result = None
239+ result = None
240+ tz_parsed = None
241241
242- if format is not None :
243- # shortcut formatting here
244- if format == '%Y%m%d' :
245- try :
246- result = _attempt_YYYYMMDD (arg , errors = errors )
247- except (ValueError , TypeError , tslibs .OutOfBoundsDatetime ):
248- raise ValueError ("cannot convert the input to "
249- "'%Y%m%d' date format" )
242+ if format is not None :
243+ # shortcut formatting here
244+ if format == '%Y%m%d' :
245+ try :
246+ result = _attempt_YYYYMMDD (arg , errors = errors )
247+ except (ValueError , TypeError , tslibs .OutOfBoundsDatetime ):
248+ raise ValueError ("cannot convert the input to "
249+ "'%Y%m%d' date format" )
250250
251- # fallback
252- if result is None :
253- try :
254- result , timezones = array_strptime (
255- arg , format , exact = exact , errors = errors )
256- if '%Z' in format or '%z' in format :
257- return _return_parsed_timezone_results (
258- result , timezones , box , tz , name )
259- except tslibs .OutOfBoundsDatetime :
251+ # fallback
252+ if result is None :
253+ try :
254+ result , timezones = array_strptime (arg , format ,
255+ exact = exact , errors = errors )
256+ if '%Z' in format or '%z' in format :
257+ return _return_parsed_timezone_results (result , timezones ,
258+ box , tz , name )
259+ except tslibs .OutOfBoundsDatetime :
260+ if errors == 'raise' :
261+ raise
262+ result = arg
263+ except ValueError :
264+ # if format was inferred, try falling back
265+ # to array_to_datetime - terminate here
266+ # for specified formats
267+ if not infer_datetime_format :
260268 if errors == 'raise' :
261269 raise
262270 result = arg
263- except ValueError :
264- # if format was inferred, try falling back
265- # to array_to_datetime - terminate here
266- # for specified formats
267- if not infer_datetime_format :
268- if errors == 'raise' :
269- raise
270- result = arg
271-
272- if result is None and (format is None or infer_datetime_format ):
271+
272+ if result is None and (format is None or infer_datetime_format ):
273+ try :
273274 result , tz_parsed = tslib .array_to_datetime (
274275 arg ,
275276 errors = errors ,
@@ -278,35 +279,41 @@ def _convert_listlike_datetimes(arg, box, format, name=None, tz=None,
278279 yearfirst = yearfirst ,
279280 require_iso8601 = require_iso8601
280281 )
281- if tz_parsed is not None :
282- if box :
283- # We can take a shortcut since the datetime64 numpy array
284- # is in UTC
285- return DatetimeIndex ._simple_new (result , name = name ,
286- tz = tz_parsed )
287- else :
288- # Convert the datetime64 numpy array to an numpy array
289- # of datetime objects
290- result = [Timestamp (ts , tz = tz_parsed ).to_pydatetime ()
291- for ts in result ]
292- return np .array (result , dtype = object )
282+ except ValueError as e :
283+ # reached when array_to_datetime raises "unless utc=True..."
284+ try :
285+ values , tz = conversion .datetime_to_datetime64 (arg )
286+ return DatetimeIndex ._simple_new (values , name = name , tz = tz )
287+ except (ValueError , TypeError ):
288+ raise e
289+
290+ return _maybe_box_date_results (result , box , tz , name , tz_parsed = tz_parsed )
291+
293292
293+ def _maybe_box_date_results (result , box , tz , name , tz_parsed = None ):
294+ from pandas import Index , DatetimeIndex
295+ if tz_parsed is not None :
294296 if box :
295- # Ensure we return an Index in all cases where box=True
296- if is_datetime64_dtype (result ):
297- return DatetimeIndex (result , tz = tz , name = name )
298- elif is_object_dtype (result ):
299- # e.g. an Index of datetime objects
300- from pandas import Index
301- return Index (result , name = name )
302- return result
297+ # We can take a shortcut since the datetime64 numpy array
298+ # is in UTC
299+ return DatetimeIndex ._simple_new (result , name = name ,
300+ tz = tz_parsed )
301+ else :
302+ # Convert the datetime64 numpy array to an numpy array
303+ # of datetime objects
304+ result = [Timestamp (ts , tz = tz_parsed ).to_pydatetime ()
305+ for ts in result ]
306+ return np .array (result , dtype = object )
307+
308+ elif box :
309+ # Ensure we return an Index in all cases where box=True
310+ if is_datetime64_dtype (result ):
311+ return DatetimeIndex (result , tz = tz , name = name )
312+ elif is_object_dtype (result ):
313+ # e.g. an Index of datetime objects
314+ return Index (result , name = name )
303315
304- except ValueError as e :
305- try :
306- values , tz = conversion .datetime_to_datetime64 (arg )
307- return DatetimeIndex ._simple_new (values , name = name , tz = tz )
308- except (ValueError , TypeError ):
309- raise e
316+ return result
310317
311318
312319def _adjust_to_origin (arg , origin , unit ):
0 commit comments