|
10 | 10 | NaT, |
11 | 11 | Series, |
12 | 12 | date_range, |
| 13 | + NA, |
13 | 14 | ) |
14 | 15 | import pandas._testing as tm |
15 | 16 |
|
@@ -440,3 +441,41 @@ def test_interpolate_arrow(self, dtype): |
440 | 441 | result = df.interpolate(limit=2) |
441 | 442 | expected = DataFrame({"a": [1, 1.5, 2.0, None, 3]}, dtype="float64[pyarrow]") |
442 | 443 | tm.assert_frame_equal(result, expected) |
| 444 | + |
| 445 | + def test_interpolate_time_with_nullable_int64(self, frame_or_series): |
| 446 | + # GH#40252 regression: method="time" should work with nullable Int64 |
| 447 | + idx = date_range("2024-01-01", periods=3, freq="D") |
| 448 | + ser = Series([1, NA, 3], dtype="Int64", index=idx) |
| 449 | + |
| 450 | + res = frame_or_series(ser).interpolate(method="time") |
| 451 | + |
| 452 | + expected_ser = Series([1.0, 2.0, 3.0], dtype="Float64", index=idx) |
| 453 | + expected = frame_or_series(expected_ser) |
| 454 | + tm.assert_equal(res, expected) |
| 455 | + |
| 456 | + def test_interpolate_time_with_nullable_float64(self, frame_or_series): |
| 457 | + # GH#40252 regression: method="time" with nullable Float64 |
| 458 | + idx = date_range("2024-02-01", periods=3, freq="D") |
| 459 | + ser = Series([1.5, NA, 3.5], dtype="Float64", index=idx) |
| 460 | + |
| 461 | + res = frame_or_series(ser).interpolate(method="time") |
| 462 | + |
| 463 | + expected_ser = Series([1.5, 2.5, 3.5], dtype="Float64", index=idx) |
| 464 | + expected = frame_or_series(expected_ser) |
| 465 | + tm.assert_equal(res, expected) |
| 466 | + |
| 467 | + def test_interpolate_time_with_nullable_int64_unsorted_index(self, frame_or_series): |
| 468 | + # Ensure correctness when the DatetimeIndex is unsorted |
| 469 | + idx_sorted = date_range("2024-03-01", periods=3, freq="D") # 1st, 2nd, 3rd |
| 470 | + idx_unsorted = idx_sorted[[2, 0, 1]] # 3rd, 1st, 2nd |
| 471 | + |
| 472 | + # values aligned with idx_unsorted: 3, 1, NA (dtype EA Int64) |
| 473 | + ser_unsorted = Series([3, 1, NA], dtype="Int64", index=idx_unsorted) |
| 474 | + |
| 475 | + res = frame_or_series(ser_unsorted).interpolate(method="time") |
| 476 | + |
| 477 | + # Expected: equivalent to sorting by time, interpolating, then restoring order |
| 478 | + expected_sorted = Series([1.0, 2.0, 3.0], dtype="Float64", index=idx_sorted) |
| 479 | + expected_ser = expected_sorted.reindex(idx_unsorted) |
| 480 | + expected = frame_or_series(expected_ser) |
| 481 | + tm.assert_equal(res, expected) |
0 commit comments