@@ -236,40 +236,41 @@ def _convert_listlike_datetimes(arg, box, format, name=None, tz=None,
236
236
require_iso8601 = not infer_datetime_format
237
237
format = None
238
238
239
- try :
240
- result = None
239
+ result = None
240
+ tz_parsed = None
241
241
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" )
250
250
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 :
260
268
if errors == 'raise' :
261
269
raise
262
270
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 :
273
274
result , tz_parsed = tslib .array_to_datetime (
274
275
arg ,
275
276
errors = errors ,
@@ -278,35 +279,41 @@ def _convert_listlike_datetimes(arg, box, format, name=None, tz=None,
278
279
yearfirst = yearfirst ,
279
280
require_iso8601 = require_iso8601
280
281
)
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
+
293
292
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 :
294
296
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 )
303
315
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
310
317
311
318
312
319
def _adjust_to_origin (arg , origin , unit ):
0 commit comments