Skip to content

Commit f56859a

Browse files
committed
Have DatetimeIndex handle the UTC conversion for Series and reformat tests
1 parent eed2d3d commit f56859a

File tree

2 files changed

+22
-34
lines changed

2 files changed

+22
-34
lines changed

pandas/core/tools/datetimes.py

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -345,17 +345,6 @@ def to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False,
345345

346346
tz = 'utc' if utc else None
347347

348-
def _maybe_convert_to_utc(arg, utc):
349-
if utc:
350-
if isinstance(arg, ABCSeries):
351-
arg = arg.dt.tz_localize('UTC')
352-
elif isinstance(arg, DatetimeIndex):
353-
if arg.tz is None:
354-
arg = arg.tz_localize('UTC')
355-
else:
356-
arg = arg.tz_convert('UTC')
357-
return arg
358-
359348
def _convert_listlike(arg, box, format, name=None, tz=tz):
360349

361350
if isinstance(arg, (list, tuple)):
@@ -375,7 +364,8 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
375364
return DatetimeIndex(arg, tz=tz, name=name)
376365
except ValueError:
377366
pass
378-
arg = _maybe_convert_to_utc(arg, utc)
367+
368+
379369
return arg
380370

381371
elif unit is not None:
@@ -394,9 +384,8 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
394384
elif getattr(arg, 'ndim', 1) > 1:
395385
raise TypeError('arg must be a string, datetime, list, tuple, '
396386
'1-d array, or Series')
397-
# _ensure_object converts Series to numpy array, need to reconvert
398-
# upon return
399-
arg_is_series = isinstance(arg, ABCSeries)
387+
388+
400389
arg = _ensure_object(arg)
401390
require_iso8601 = False
402391

@@ -456,9 +445,6 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
456445
)
457446
if is_datetime64_dtype(result) and box:
458447
result = DatetimeIndex(result, tz=tz, name=name)
459-
# GH 6415
460-
elif arg_is_series and utc:
461-
result = _maybe_convert_to_utc(Series(result, name=name), utc)
462448
return result
463449

464450
except ValueError as e:
@@ -533,7 +519,7 @@ def _convert_listlike(arg, box, format, name=None, tz=tz):
533519
result = arg
534520
elif isinstance(arg, ABCSeries):
535521
from pandas import Series
536-
values = _convert_listlike(arg, False, format, name=arg.name)
522+
values = _convert_listlike(arg, True, format)
537523
result = Series(values, index=arg.index, name=arg.name)
538524
elif isinstance(arg, (ABCDataFrame, MutableMapping)):
539525
result = _assemble_from_unit_mappings(arg, errors=errors)

pandas/tests/indexes/datetimes/test_tools.py

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -269,37 +269,39 @@ def test_to_datetime_utc_is_true(self):
269269
result = pd.to_datetime(date_range, utc=True)
270270
expected = pd.DatetimeIndex(data=date_range)
271271
tm.assert_index_equal(result, expected)
272-
273-
def test_to_datetime_utc_true_with_series(self):
272+
273+
@pytest.mark.parametrize("init_constructor, end_constructor, test_method",
274+
[(Index, DatetimeIndex, tm.assert_index_equal),
275+
(Series, Series, tm.assert_series_equal)])
276+
def test_to_datetime_utc_true_with_series(self,
277+
init_constructor,
278+
end_constructor,
279+
test_method):
274280
# GH 6415: UTC=True with Series
275281
data = ['20100102 121314', '20100102 121315']
276282
expected_data = [pd.Timestamp('2010-01-02 12:13:14', tz='utc'),
277283
pd.Timestamp('2010-01-02 12:13:15', tz='utc')]
278-
result = pd.to_datetime(pd.Series(data),
279-
format='%Y%m%d %H%M%S',
280-
utc=True)
281-
expected = pd.Series(expected_data)
282-
tm.assert_series_equal(result, expected)
283-
result = pd.to_datetime(pd.Index(data),
284+
285+
result = pd.to_datetime(init_constructor(data),
284286
format='%Y%m%d %H%M%S',
285287
utc=True)
286-
expected = pd.DatetimeIndex(expected_data)
287-
tm.assert_index_equal(result, expected)
288+
expected = end_constructor(expected_data)
289+
test_method(result, expected)
288290

291+
def test_to_datetime_utc_true_with_series_single_value(self):
289292
# GH 15760 UTC=True with Series
290293
ts = 1.5e18
291294
result = pd.to_datetime(pd.Series([ts]), utc=True)
292295
expected = pd.Series([pd.Timestamp(ts, tz='utc')])
293296
tm.assert_series_equal(result, expected)
294297

298+
@pytest.mark.parametrize("dtype", [None, 'datetime64[ns]'])
299+
def test_to_datetime_utc_true_with_naive_series(self, dtype):
295300
test_dates = ['2013-01-01 00:00:00-01:00'] * 10
301+
ser = pd.Series(test_dates, dtype=dtype)
302+
result = pd.to_datetime(ser, utc=True)
296303
expected_data = [pd.Timestamp('20130101 01:00:00', tz='utc')] * 10
297304
expected = pd.Series(expected_data)
298-
ser = Series(test_dates)
299-
result = pd.to_datetime(ser, utc=True)
300-
tm.assert_series_equal(result, expected)
301-
ser_naive = Series(test_dates, dtype='datetime64[ns]')
302-
result = pd.to_datetime(ser_naive, utc=True)
303305
tm.assert_series_equal(result, expected)
304306

305307
def test_to_datetime_tz_psycopg2(self):

0 commit comments

Comments
 (0)