Skip to content

Commit bd7ece0

Browse files
authored
BUG: DatetimeIndex.union with non-nano (#59037)
* BUG: DatetimeIndex.union with non-nano * Add as_unit
1 parent dfaaa39 commit bd7ece0

File tree

3 files changed

+21
-2
lines changed

3 files changed

+21
-2
lines changed

Diff for: doc/source/whatsnew/v3.0.0.rst

+1
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ Datetimelike
495495
- Bug in :meth:`Dataframe.agg` with df with missing values resulting in IndexError (:issue:`58810`)
496496
- Bug in :meth:`DatetimeIndex.is_year_start` and :meth:`DatetimeIndex.is_quarter_start` does not raise on Custom business days frequencies bigger then "1C" (:issue:`58664`)
497497
- Bug in :meth:`DatetimeIndex.is_year_start` and :meth:`DatetimeIndex.is_quarter_start` returning ``False`` on double-digit frequencies (:issue:`58523`)
498+
- Bug in :meth:`DatetimeIndex.union` when ``unit`` was non-nanosecond (:issue:`59036`)
498499
- Bug in setting scalar values with mismatched resolution into arrays with non-nanosecond ``datetime64``, ``timedelta64`` or :class:`DatetimeTZDtype` incorrectly truncating those scalars (:issue:`56410`)
499500

500501
Timedelta

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

+4-2
Original file line numberDiff line numberDiff line change
@@ -523,7 +523,7 @@ def _as_range_index(self) -> RangeIndex:
523523
# Convert our i8 representations to RangeIndex
524524
# Caller is responsible for checking isinstance(self.freq, Tick)
525525
freq = cast(Tick, self.freq)
526-
tick = Timedelta(freq).as_unit("ns")._value
526+
tick = Timedelta(freq).as_unit(self.unit)._value
527527
rng = range(self[0]._value, self[-1]._value + tick, tick)
528528
return RangeIndex(rng)
529529

@@ -536,7 +536,9 @@ def _wrap_range_setop(self, other, res_i8) -> Self:
536536
# RangeIndex defaults to step=1, which we don't want.
537537
new_freq = self.freq
538538
elif isinstance(res_i8, RangeIndex):
539-
new_freq = to_offset(Timedelta(res_i8.step))
539+
new_freq = to_offset(
540+
Timedelta(res_i8.step, unit=self.unit).as_unit(self.unit)
541+
)
540542

541543
# TODO(GH#41493): we cannot just do
542544
# type(self._data)(res_i8.values, dtype=self.dtype, freq=new_freq)

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

+16
Original file line numberDiff line numberDiff line change
@@ -664,3 +664,19 @@ def test_intersection_dst_transition(self, tz):
664664
result = index1.union(index2)
665665
expected = date_range("2021-10-28", periods=6, freq="D", tz="Europe/London")
666666
tm.assert_index_equal(result, expected)
667+
668+
669+
def test_union_non_nano_rangelike():
670+
# GH 59036
671+
l1 = DatetimeIndex(
672+
["2024-05-11", "2024-05-12"], dtype="datetime64[us]", name="Date", freq="D"
673+
)
674+
l2 = DatetimeIndex(["2024-05-13"], dtype="datetime64[us]", name="Date", freq="D")
675+
result = l1.union(l2)
676+
expected = DatetimeIndex(
677+
["2024-05-11", "2024-05-12", "2024-05-13"],
678+
dtype="datetime64[us]",
679+
name="Date",
680+
freq="D",
681+
)
682+
tm.assert_index_equal(result, expected)

0 commit comments

Comments
 (0)