@@ -274,6 +274,58 @@ def test_concat_NaT_series_dataframe_all_NaT(self, tz1, tz2):
274
274
result = concat ([first , second ])
275
275
tm .assert_frame_equal (result , expected )
276
276
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
+
277
329
278
330
class TestTimezoneConcat :
279
331
def test_concat_tz_series (self ):
0 commit comments