Skip to content

Commit 5d6259a

Browse files
jbrockmendelroberthdevries
authored andcommitted
BUG: DataFrame.iat incorrectly wrapping datetime objects (pandas-dev#32089)
1 parent 4ffcdf8 commit 5d6259a

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

doc/source/whatsnew/v1.1.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ Indexing
159159
- Bug in :meth:`PeriodIndex.is_monotonic` incorrectly returning ``True`` when containing leading ``NaT`` entries (:issue:`31437`)
160160
- Bug in :meth:`DatetimeIndex.get_loc` raising ``KeyError`` with converted-integer key instead of the user-passed key (:issue:`31425`)
161161
- Bug in :meth:`Series.xs` incorrectly returning ``Timestamp`` instead of ``datetime64`` in some object-dtype cases (:issue:`31630`)
162+
- Bug in :meth:`DataFrame.iat` incorrectly returning ``Timestamp`` instead of ``datetime`` in some object-dtype cases (:issue:`32809`)
162163

163164
Missing
164165
^^^^^^^

pandas/core/frame.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -2622,8 +2622,8 @@ def _get_value(self, index, col, takeable: bool = False):
26222622
scalar
26232623
"""
26242624
if takeable:
2625-
series = self._iget_item_cache(col)
2626-
return com.maybe_box_datetimelike(series._values[index])
2625+
series = self._ixs(col, axis=1)
2626+
return series._values[index]
26272627

26282628
series = self._get_item_cache(col)
26292629
engine = self.index._engine

pandas/tests/indexing/test_scalar.py

+22
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
""" test scalar indexing, including at and iat """
2+
from datetime import datetime, timedelta
23

34
import numpy as np
45
import pytest
@@ -288,3 +289,24 @@ def test_getitem_zerodim_np_array(self):
288289
s = Series([1, 2])
289290
result = s[np.array(0)]
290291
assert result == 1
292+
293+
294+
def test_iat_dont_wrap_object_datetimelike():
295+
# GH#32809 .iat calls go through DataFrame._get_value, should not
296+
# call maybe_box_datetimelike
297+
dti = date_range("2016-01-01", periods=3)
298+
tdi = dti - dti
299+
ser = Series(dti.to_pydatetime(), dtype=object)
300+
ser2 = Series(tdi.to_pytimedelta(), dtype=object)
301+
df = DataFrame({"A": ser, "B": ser2})
302+
assert (df.dtypes == object).all()
303+
304+
for result in [df.at[0, "A"], df.iat[0, 0], df.loc[0, "A"], df.iloc[0, 0]]:
305+
assert result is ser[0]
306+
assert isinstance(result, datetime)
307+
assert not isinstance(result, Timestamp)
308+
309+
for result in [df.at[1, "B"], df.iat[1, 1], df.loc[1, "B"], df.iloc[1, 1]]:
310+
assert result is ser2[1]
311+
assert isinstance(result, timedelta)
312+
assert not isinstance(result, Timedelta)

0 commit comments

Comments
 (0)