Skip to content

Commit d9f5c25

Browse files
committed
TST: Add regression tests for concat with non-ns DatetimeIndex units (GH#58471)
1 parent 452c7fb commit d9f5c25

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

pandas/tests/reshape/concat/test_datetimes.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,58 @@ def test_concat_NaT_series_dataframe_all_NaT(self, tz1, tz2):
274274
result = concat([first, second])
275275
tm.assert_frame_equal(result, expected)
276276

277+
@pytest.mark.parametrize("unit", ["ns", "us", "ms", "s"])
278+
def test_concat_series_columns_nonoverlap_5min_units(self, unit):
279+
# GH#58471
280+
# Non-overlapping daily blocks at 5-minute frequency
281+
# should union to a continuous 3-day 5min range
282+
idx1 = date_range("2024-01-01", periods=24 * 12, freq="5min", unit=unit)
283+
idx2 = date_range("2024-01-02", periods=24 * 12, freq="5min", unit=unit)
284+
idx3 = date_range("2024-01-03", periods=24 * 12, freq="5min", unit=unit)
285+
286+
s1 = Series(np.arange(len(idx1)), index=idx1, name="a")
287+
s2 = Series(np.arange(len(idx2)), index=idx2, name="b")
288+
s3 = Series(np.arange(len(idx3)), index=idx3, name="c")
289+
290+
df = concat([s1, s2, s3], axis=1)
291+
292+
exp = date_range("2024-01-01", "2024-01-03 23:55", freq="5min", unit=unit)
293+
tm.assert_index_equal(df.index, exp, check_exact=True)
294+
295+
@pytest.mark.parametrize("unit", ["us", "ms", "s"])
296+
def test_concat_series_columns_daily_units_no_bogus_dates(self, unit):
297+
# GH#58471
298+
# Overlapping daily ranges at micro/milli/second units
299+
# must not lose rows or create bogus future dates
300+
idx1 = date_range("2013-08-16", "2024-05-01", freq="D", unit=unit)
301+
idx2 = date_range("2015-09-19", "2024-05-01", freq="D", unit=unit)
302+
303+
s1 = Series(np.arange(len(idx1)), index=idx1, name="x")
304+
s2 = Series(np.arange(len(idx2)), index=idx2, name="y")
305+
306+
df = concat([s1, s2], axis=1)
307+
308+
exp = date_range(idx1[0], idx2[-1], freq="D", unit=unit)
309+
tm.assert_index_equal(df.index, exp, check_exact=True)
310+
311+
@pytest.mark.parametrize("unit", ["ns", "us", "ms", "s"])
312+
def test_concat_series_columns_month_end_units_order_insensitive(self, unit):
313+
# GH#58471
314+
# Monthly-end ranges should be order-insensitive
315+
# and preserve the full union
316+
idx1 = date_range(start="2015-01-31", end="2023-01-31", freq="ME", unit=unit)
317+
idx2 = date_range(start="2014-01-31", end="2024-01-31", freq="ME", unit=unit)
318+
319+
s1 = Series(np.arange(len(idx1)), index=idx1, name="m1")
320+
s2 = Series(np.arange(len(idx2)), index=idx2, name="m2")
321+
322+
df1 = concat([s1, s2], axis=1).sort_index()
323+
df2 = concat([s2, s1], axis=1).sort_index()
324+
325+
exp = date_range(start=idx2[0], end=idx2[-1], freq="ME", unit=unit)
326+
tm.assert_index_equal(df1.index, exp, check_exact=True)
327+
tm.assert_index_equal(df2.index, exp, check_exact=True)
328+
277329

278330
class TestTimezoneConcat:
279331
def test_concat_tz_series(self):

0 commit comments

Comments
 (0)