Skip to content

Commit a2ee3ee

Browse files
jbrockmendelnoatamir
authored andcommitted
CLN: assorted (pandas-dev#48385)
* CLN: assorted * mypy fixup
1 parent 0362282 commit a2ee3ee

File tree

10 files changed

+85
-37
lines changed

10 files changed

+85
-37
lines changed

pandas/_libs/tslibs/offsets.pyi

+1
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ class BaseOffset:
8181
@property
8282
def freqstr(self) -> str: ...
8383
def apply_index(self, dtindex: DatetimeIndex) -> DatetimeIndex: ...
84+
def _apply(self, other): ...
8485
def _apply_array(self, dtarr) -> None: ...
8586
def rollback(self, dt: datetime) -> datetime: ...
8687
def rollforward(self, dt: datetime) -> datetime: ...

pandas/_libs/tslibs/offsets.pyx

+3
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,9 @@ cdef class BaseOffset:
681681
res = self._apply_array(dtindex)
682682
return type(dtindex)(res)
683683

684+
def _apply(self, other):
685+
raise NotImplementedError("implemented by subclasses")
686+
684687
@apply_array_wraps
685688
def _apply_array(self, dtarr):
686689
raise NotImplementedError(

pandas/core/arrays/datetimes.py

+42-16
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@
7777

7878
from pandas.tseries.frequencies import get_period_alias
7979
from pandas.tseries.offsets import (
80-
BDay,
8180
Day,
8281
Tick,
8382
)
@@ -395,7 +394,9 @@ def _generate_range(
395394
if isinstance(freq, Tick):
396395
i8values = generate_regular_range(start, end, periods, freq)
397396
else:
398-
xdr = generate_range(start=start, end=end, periods=periods, offset=freq)
397+
xdr = _generate_range(
398+
start=start, end=end, periods=periods, offset=freq
399+
)
399400
i8values = np.array([x.value for x in xdr], dtype=np.int64)
400401

401402
endpoint_tz = start.tz if start is not None else end.tz
@@ -2494,18 +2495,23 @@ def _maybe_localize_point(ts, is_none, is_not_none, freq, tz, ambiguous, nonexis
24942495
return ts
24952496

24962497

2497-
def generate_range(start=None, end=None, periods=None, offset=BDay()):
2498+
def _generate_range(
2499+
start: Timestamp | None,
2500+
end: Timestamp | None,
2501+
periods: int | None,
2502+
offset: BaseOffset,
2503+
):
24982504
"""
24992505
Generates a sequence of dates corresponding to the specified time
25002506
offset. Similar to dateutil.rrule except uses pandas DateOffset
25012507
objects to represent time increments.
25022508
25032509
Parameters
25042510
----------
2505-
start : datetime, (default None)
2506-
end : datetime, (default None)
2507-
periods : int, (default None)
2508-
offset : DateOffset, (default BDay())
2511+
start : Timestamp or None
2512+
end : Timestamp or None
2513+
periods : int or None
2514+
offset : DateOffset,
25092515
25102516
Notes
25112517
-----
@@ -2520,26 +2526,46 @@ def generate_range(start=None, end=None, periods=None, offset=BDay()):
25202526
"""
25212527
offset = to_offset(offset)
25222528

2523-
start = Timestamp(start)
2524-
start = start if start is not NaT else None
2525-
end = Timestamp(end)
2526-
end = end if end is not NaT else None
2529+
# Argument 1 to "Timestamp" has incompatible type "Optional[Timestamp]";
2530+
# expected "Union[integer[Any], float, str, date, datetime64]"
2531+
start = Timestamp(start) # type: ignore[arg-type]
2532+
# Non-overlapping identity check (left operand type: "Timestamp", right
2533+
# operand type: "NaTType")
2534+
start = start if start is not NaT else None # type: ignore[comparison-overlap]
2535+
# Argument 1 to "Timestamp" has incompatible type "Optional[Timestamp]";
2536+
# expected "Union[integer[Any], float, str, date, datetime64]"
2537+
end = Timestamp(end) # type: ignore[arg-type]
2538+
# Non-overlapping identity check (left operand type: "Timestamp", right
2539+
# operand type: "NaTType")
2540+
end = end if end is not NaT else None # type: ignore[comparison-overlap]
25272541

25282542
if start and not offset.is_on_offset(start):
2529-
start = offset.rollforward(start)
2543+
# Incompatible types in assignment (expression has type "datetime",
2544+
# variable has type "Optional[Timestamp]")
2545+
start = offset.rollforward(start) # type: ignore[assignment]
25302546

25312547
elif end and not offset.is_on_offset(end):
2532-
end = offset.rollback(end)
2548+
# Incompatible types in assignment (expression has type "datetime",
2549+
# variable has type "Optional[Timestamp]")
2550+
end = offset.rollback(end) # type: ignore[assignment]
25332551

2534-
if periods is None and end < start and offset.n >= 0:
2552+
# Unsupported operand types for < ("Timestamp" and "None")
2553+
if periods is None and end < start and offset.n >= 0: # type: ignore[operator]
25352554
end = None
25362555
periods = 0
25372556

25382557
if end is None:
2539-
end = start + (periods - 1) * offset
2558+
# error: No overload variant of "__radd__" of "BaseOffset" matches
2559+
# argument type "None"
2560+
end = start + (periods - 1) * offset # type: ignore[operator]
25402561

25412562
if start is None:
2542-
start = end - (periods - 1) * offset
2563+
# error: No overload variant of "__radd__" of "BaseOffset" matches
2564+
# argument type "None"
2565+
start = end - (periods - 1) * offset # type: ignore[operator]
2566+
2567+
start = cast(Timestamp, start)
2568+
end = cast(Timestamp, end)
25432569

25442570
cur = start
25452571
if offset.n >= 0:

pandas/core/arrays/period.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class PeriodArray(dtl.DatelikeOps, libperiod.PeriodMixin):
172172
_typ = "periodarray" # ABCPeriodArray
173173
_internal_fill_value = np.int64(iNaT)
174174
_recognized_scalars = (Period,)
175-
_is_recognized_dtype = is_period_dtype
175+
_is_recognized_dtype = is_period_dtype # check_compatible_with checks freq match
176176
_infer_matches = ("period",)
177177

178178
@property

pandas/core/generic.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -1917,7 +1917,7 @@ def _drop_labels_or_levels(self, keys, axis: int = 0):
19171917
# Perform copy upfront and then use inplace operations below.
19181918
# This ensures that we always perform exactly one copy.
19191919
# ``copy`` and/or ``inplace`` options could be added in the future.
1920-
dropped = self.copy()
1920+
dropped = self.copy(deep=False)
19211921

19221922
if axis == 0:
19231923
# Handle dropping index levels

pandas/core/indexing.py

-4
Original file line numberDiff line numberDiff line change
@@ -955,8 +955,6 @@ def _getitem_lowerdim(self, tup: tuple):
955955
# is equivalent.
956956
# (see the other place where we call _handle_lowerdim_multi_index_axis0)
957957
with suppress(IndexingError):
958-
# error "_LocationIndexer" has no attribute
959-
# "_handle_lowerdim_multi_index_axis0"
960958
return cast(_LocIndexer, self)._handle_lowerdim_multi_index_axis0(tup)
961959

962960
tup = self._validate_key_length(tup)
@@ -1013,8 +1011,6 @@ def _getitem_nested_tuple(self, tup: tuple):
10131011
# DataFrame, IndexingError is not raised when slice(None,None,None)
10141012
# with one row.
10151013
with suppress(IndexingError):
1016-
# error "_LocationIndexer" has no attribute
1017-
# "_handle_lowerdim_multi_index_axis0"
10181014
return cast(_LocIndexer, self)._handle_lowerdim_multi_index_axis0(
10191015
tup
10201016
)

pandas/core/internals/concat.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ def get_reindexed_values(self, empty_dtype: DtypeObj, upcasted_na) -> ArrayLike:
455455
if upcasted_na is None and self.block.dtype.kind != "V":
456456
# No upcasting is necessary
457457
fill_value = self.block.fill_value
458-
values = self.block.get_values()
458+
values = self.block.values
459459
else:
460460
fill_value = upcasted_na
461461

pandas/tests/indexes/datetimes/test_date_range.py

+26-8
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
offsets,
3535
)
3636
import pandas._testing as tm
37-
from pandas.core.arrays.datetimes import generate_range
37+
from pandas.core.arrays.datetimes import _generate_range as generate_range
3838

3939
START, END = datetime(2009, 1, 1), datetime(2010, 1, 1)
4040

@@ -840,27 +840,45 @@ def test_date_range_with_tz(self, tzstr):
840840

841841
class TestGenRangeGeneration:
842842
def test_generate(self):
843-
rng1 = list(generate_range(START, END, offset=BDay()))
844-
rng2 = list(generate_range(START, END, offset="B"))
843+
rng1 = list(generate_range(START, END, periods=None, offset=BDay()))
844+
rng2 = list(generate_range(START, END, periods=None, offset="B"))
845845
assert rng1 == rng2
846846

847847
def test_generate_cday(self):
848-
rng1 = list(generate_range(START, END, offset=CDay()))
849-
rng2 = list(generate_range(START, END, offset="C"))
848+
rng1 = list(generate_range(START, END, periods=None, offset=CDay()))
849+
rng2 = list(generate_range(START, END, periods=None, offset="C"))
850850
assert rng1 == rng2
851851

852852
def test_1(self):
853-
rng = list(generate_range(start=datetime(2009, 3, 25), periods=2))
853+
rng = list(
854+
generate_range(
855+
start=datetime(2009, 3, 25), end=None, periods=2, offset=BDay()
856+
)
857+
)
854858
expected = [datetime(2009, 3, 25), datetime(2009, 3, 26)]
855859
assert rng == expected
856860

857861
def test_2(self):
858-
rng = list(generate_range(start=datetime(2008, 1, 1), end=datetime(2008, 1, 3)))
862+
rng = list(
863+
generate_range(
864+
start=datetime(2008, 1, 1),
865+
end=datetime(2008, 1, 3),
866+
periods=None,
867+
offset=BDay(),
868+
)
869+
)
859870
expected = [datetime(2008, 1, 1), datetime(2008, 1, 2), datetime(2008, 1, 3)]
860871
assert rng == expected
861872

862873
def test_3(self):
863-
rng = list(generate_range(start=datetime(2008, 1, 5), end=datetime(2008, 1, 6)))
874+
rng = list(
875+
generate_range(
876+
start=datetime(2008, 1, 5),
877+
end=datetime(2008, 1, 6),
878+
periods=None,
879+
offset=BDay(),
880+
)
881+
)
864882
expected = []
865883
assert rng == expected
866884

pandas/tests/plotting/test_series.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -734,7 +734,11 @@ def test_custom_business_day_freq(self):
734734

735735
_check_plot_works(s.plot)
736736

737-
@pytest.mark.xfail(reason="GH#24426")
737+
@pytest.mark.xfail(
738+
reason="GH#24426, see also "
739+
"github.com/pandas-dev/pandas/commit/"
740+
"ef1bd69fa42bbed5d09dd17f08c44fc8bfc2b685#r61470674"
741+
)
738742
def test_plot_accessor_updates_on_inplace(self):
739743
ser = Series([1, 2, 3, 4])
740744
_, ax = self.plt.subplots()

pandas/tests/scalar/timestamp/test_timestamp.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -902,17 +902,17 @@ def test_addsub_timedeltalike_non_nano(self, dt64, ts, td):
902902
assert result._reso == ts._reso
903903
assert result == expected
904904

905-
@pytest.mark.xfail(reason="tz_localize not yet implemented for non-nano")
906905
def test_addsub_offset(self, ts_tz):
907906
# specifically non-Tick offset
908-
off = offsets.YearBegin(1)
907+
off = offsets.YearEnd(1)
909908
result = ts_tz + off
910909

911910
assert isinstance(result, Timestamp)
912911
assert result._reso == ts_tz._reso
913-
# If ts_tz is ever on the last day of the year, the year would be
914-
# incremented by one
915-
assert result.year == ts_tz.year
912+
if ts_tz.month == 12 and ts_tz.day == 31:
913+
assert result.year == ts_tz.year + 1
914+
else:
915+
assert result.year == ts_tz.year
916916
assert result.day == 31
917917
assert result.month == 12
918918
assert tz_compare(result.tz, ts_tz.tz)

0 commit comments

Comments
 (0)