Skip to content

Commit bfa30d6

Browse files
committed
Catch exception around much smaller piece of code
1 parent 3edc18d commit bfa30d6

File tree

1 file changed

+62
-55
lines changed

1 file changed

+62
-55
lines changed

pandas/core/tools/datetimes.py

Lines changed: 62 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -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

312319
def _adjust_to_origin(arg, origin, unit):

0 commit comments

Comments
 (0)