Skip to content

Commit 85fc5d8

Browse files
committed
Merge remote-tracking branch 'upstream/master' into combine-exception
2 parents 9059c0d + 1d9f76c commit 85fc5d8

File tree

11 files changed

+47
-80
lines changed

11 files changed

+47
-80
lines changed

Diff for: doc/source/whatsnew/v0.24.0.txt

+1
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,7 @@ Datetimelike
656656
- Bug in :class:`DatetimeIndex` incorrectly allowing indexing with ``Timedelta`` object (:issue:`20464`)
657657
- Bug in :class:`DatetimeIndex` where frequency was being set if original frequency was ``None`` (:issue:`22150`)
658658
- Bug in rounding methods of :class:`DatetimeIndex` (:meth:`~DatetimeIndex.round`, :meth:`~DatetimeIndex.ceil`, :meth:`~DatetimeIndex.floor`) and :class:`Timestamp` (:meth:`~Timestamp.round`, :meth:`~Timestamp.ceil`, :meth:`~Timestamp.floor`) could give rise to loss of precision (:issue:`22591`)
659+
- Bug in :func:`to_datetime` with an :class:`Index` argument that would drop the ``name`` from the result (:issue:`21697`)
659660

660661
Timedelta
661662
^^^^^^^^^

Diff for: pandas/core/indexes/base.py

+1-13
Original file line numberDiff line numberDiff line change
@@ -1114,7 +1114,7 @@ def to_series(self, index=None, name=None):
11141114
if name is None:
11151115
name = self.name
11161116

1117-
return Series(self._to_embed(), index=index, name=name)
1117+
return Series(self.values.copy(), index=index, name=name)
11181118

11191119
def to_frame(self, index=True, name=None):
11201120
"""
@@ -1177,18 +1177,6 @@ def to_frame(self, index=True, name=None):
11771177
result.index = self
11781178
return result
11791179

1180-
def _to_embed(self, keep_tz=False, dtype=None):
1181-
"""
1182-
*this is an internal non-public method*
1183-
1184-
return an array repr of this object, potentially casting to object
1185-
1186-
"""
1187-
if dtype is not None:
1188-
return self.astype(dtype)._to_embed(keep_tz=keep_tz)
1189-
1190-
return self.values.copy()
1191-
11921180
_index_shared_docs['astype'] = """
11931181
Create an Index with values cast to dtypes. The class of a new Index
11941182
is determined by dtype. When conversion is impossible, a ValueError

Diff for: pandas/core/indexes/datetimes.py

+4-14
Original file line numberDiff line numberDiff line change
@@ -665,23 +665,13 @@ def to_series(self, keep_tz=False, index=None, name=None):
665665
if name is None:
666666
name = self.name
667667

668-
return Series(self._to_embed(keep_tz), index=index, name=name)
669-
670-
def _to_embed(self, keep_tz=False, dtype=None):
671-
"""
672-
return an array repr of this object, potentially casting to object
673-
674-
This is for internal compat
675-
"""
676-
if dtype is not None:
677-
return self.astype(dtype)._to_embed(keep_tz=keep_tz)
678-
679668
if keep_tz and self.tz is not None:
680-
681669
# preserve the tz & copy
682-
return self.copy(deep=True)
670+
values = self.copy(deep=True)
671+
else:
672+
values = self.values.copy()
683673

684-
return self.values.copy()
674+
return Series(values, index=index, name=name)
685675

686676
def to_period(self, freq=None):
687677
"""

Diff for: pandas/core/indexes/period.py

-10
Original file line numberDiff line numberDiff line change
@@ -365,16 +365,6 @@ def __array_wrap__(self, result, context=None):
365365
# cannot pass _simple_new as it is
366366
return self._shallow_copy(result, freq=self.freq, name=self.name)
367367

368-
def _to_embed(self, keep_tz=False, dtype=None):
369-
"""
370-
return an array repr of this object, potentially casting to object
371-
"""
372-
373-
if dtype is not None:
374-
return self.astype(dtype)._to_embed(keep_tz=keep_tz)
375-
376-
return self.astype(object).values
377-
378368
@property
379369
def size(self):
380370
# Avoid materializing self._values

Diff for: pandas/core/tools/datetimes.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,13 @@ def _convert_and_box_cache(arg, cache_array, box, errors, name=None):
9999
result = Series(arg).map(cache_array)
100100
if box:
101101
if errors == 'ignore':
102-
return Index(result)
102+
return Index(result, name=name)
103103
else:
104104
return DatetimeIndex(result, name=name)
105105
return result.values
106106

107107

108-
def _return_parsed_timezone_results(result, timezones, box, tz):
108+
def _return_parsed_timezone_results(result, timezones, box, tz, name):
109109
"""
110110
Return results from array_strptime if a %z or %Z directive was passed.
111111
@@ -119,6 +119,9 @@ def _return_parsed_timezone_results(result, timezones, box, tz):
119119
True boxes result as an Index-like, False returns an ndarray
120120
tz : object
121121
None or pytz timezone object
122+
name : string, default None
123+
Name for a DatetimeIndex
124+
122125
Returns
123126
-------
124127
tz_result : ndarray of parsed dates with timezone
@@ -136,7 +139,7 @@ def _return_parsed_timezone_results(result, timezones, box, tz):
136139
in zip(result, timezones)])
137140
if box:
138141
from pandas import Index
139-
return Index(tz_results)
142+
return Index(tz_results, name=name)
140143
return tz_results
141144

142145

@@ -209,7 +212,7 @@ def _convert_listlike_datetimes(arg, box, format, name=None, tz=None,
209212
if box:
210213
if errors == 'ignore':
211214
from pandas import Index
212-
return Index(result)
215+
return Index(result, name=name)
213216

214217
return DatetimeIndex(result, tz=tz, name=name)
215218
return result
@@ -252,7 +255,7 @@ def _convert_listlike_datetimes(arg, box, format, name=None, tz=None,
252255
arg, format, exact=exact, errors=errors)
253256
if '%Z' in format or '%z' in format:
254257
return _return_parsed_timezone_results(
255-
result, timezones, box, tz)
258+
result, timezones, box, tz, name)
256259
except tslibs.OutOfBoundsDatetime:
257260
if errors == 'raise':
258261
raise

Diff for: pandas/tests/extension/conftest.py

+16-4
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,24 @@ def all_data(request, data, data_missing):
3131

3232

3333
@pytest.fixture
34-
def data_repeated():
35-
"""Return different versions of data for count times"""
34+
def data_repeated(data):
35+
"""
36+
Generate many datasets.
37+
38+
Parameters
39+
----------
40+
data : fixture implementing `data`
41+
42+
Returns
43+
-------
44+
Callable[[int], Generator]:
45+
A callable that takes a `count` argument and
46+
returns a generator yielding `count` datasets.
47+
"""
3648
def gen(count):
3749
for _ in range(count):
38-
yield NotImplementedError
39-
yield gen
50+
yield data
51+
return gen
4052

4153

4254
@pytest.fixture

Diff for: pandas/tests/extension/decimal_array/test_decimal.py

-8
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,6 @@ def data_missing():
3030
return DecimalArray([decimal.Decimal('NaN'), decimal.Decimal(1)])
3131

3232

33-
@pytest.fixture
34-
def data_repeated():
35-
def gen(count):
36-
for _ in range(count):
37-
yield DecimalArray(make_data())
38-
yield gen
39-
40-
4133
@pytest.fixture
4234
def data_for_sorting():
4335
return DecimalArray([decimal.Decimal('1'),

Diff for: pandas/tests/extension/test_categorical.py

-9
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,6 @@ def data_missing():
4545
return Categorical([np.nan, 'A'])
4646

4747

48-
@pytest.fixture
49-
def data_repeated():
50-
"""Return different versions of data for count times"""
51-
def gen(count):
52-
for _ in range(count):
53-
yield Categorical(make_data())
54-
yield gen
55-
56-
5748
@pytest.fixture
5849
def data_for_sorting():
5950
return Categorical(['A', 'B', 'C'], categories=['C', 'A', 'B'],

Diff for: pandas/tests/extension/test_integer.py

-8
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,6 @@ def data_missing(dtype):
4747
return integer_array([np.nan, 1], dtype=dtype)
4848

4949

50-
@pytest.fixture
51-
def data_repeated(data):
52-
def gen(count):
53-
for _ in range(count):
54-
yield data
55-
yield gen
56-
57-
5850
@pytest.fixture
5951
def data_for_sorting(dtype):
6052
return integer_array([1, 2, 0], dtype=dtype)

Diff for: pandas/tests/extension/test_interval.py

-9
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,6 @@ def data_missing():
4747
return IntervalArray.from_tuples([None, (0, 1)])
4848

4949

50-
@pytest.fixture
51-
def data_repeated():
52-
"""Return different versions of data for count times"""
53-
def gen(count):
54-
for _ in range(count):
55-
yield IntervalArray(make_data())
56-
yield gen
57-
58-
5950
@pytest.fixture
6051
def data_for_sorting():
6152
return IntervalArray.from_tuples([(1, 2), (2, 3), (0, 1)])

Diff for: pandas/tests/indexes/datetimes/test_tools.py

+17
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,15 @@ def test_to_datetime_parse_timezone_malformed(self, offset):
233233
with pytest.raises(ValueError):
234234
pd.to_datetime([date], format=fmt)
235235

236+
def test_to_datetime_parse_timezone_keeps_name(self):
237+
# GH 21697
238+
fmt = '%Y-%m-%d %H:%M:%S %z'
239+
arg = pd.Index(['2010-01-01 12:00:00 Z'], name='foo')
240+
result = pd.to_datetime(arg, format=fmt)
241+
expected = pd.DatetimeIndex(['2010-01-01 12:00:00'], tz='UTC',
242+
name='foo')
243+
tm.assert_index_equal(result, expected)
244+
236245

237246
class TestToDatetime(object):
238247
def test_to_datetime_pydatetime(self):
@@ -765,6 +774,14 @@ def test_unit_rounding(self, cache):
765774
expected = pd.Timestamp('2015-06-19 19:55:31.877000093')
766775
assert result == expected
767776

777+
@pytest.mark.parametrize('cache', [True, False])
778+
def test_unit_ignore_keeps_name(self, cache):
779+
# GH 21697
780+
expected = pd.Index([15e9] * 2, name='name')
781+
result = pd.to_datetime(expected, errors='ignore', box=True, unit='s',
782+
cache=cache)
783+
tm.assert_index_equal(result, expected)
784+
768785
@pytest.mark.parametrize('cache', [True, False])
769786
def test_dataframe(self, cache):
770787

0 commit comments

Comments
 (0)