# pyright: strict from datetime import ( date as _date, datetime, time as _time, timedelta, tzinfo as _tzinfo, ) from datetime import _IsoCalendarDate # pyright: ignore[reportPrivateUsage] import sys from time import struct_time from typing import ( ClassVar, Literal, SupportsIndex, overload, ) import numpy as np from pandas import ( DatetimeIndex, TimedeltaIndex, ) from pandas.core.indexes.base import Index from pandas.core.series import ( Series, TimedeltaSeries, TimestampSeries, ) from typing_extensions import ( Never, Self, TypeAlias, ) from pandas._libs.tslibs import ( BaseOffset, Period, Tick, Timedelta, ) from pandas._typing import ( ShapeT, TimestampNonexistent, TimeUnit, np_1darray, np_ndarray, ) _Ambiguous: TypeAlias = bool | Literal["raise", "NaT"] # Repeated from `_typing.pyi` so as to satisfy mixed strict / non-strict paths. # https://github.com/pandas-dev/pandas-stubs/pull/1151#issuecomment-2715130190 TimeZones: TypeAlias = str | _tzinfo | None | int class Timestamp(datetime, SupportsIndex): min: ClassVar[Timestamp] # pyright: ignore[reportIncompatibleVariableOverride] max: ClassVar[Timestamp] # pyright: ignore[reportIncompatibleVariableOverride] resolution: ClassVar[ # pyright: ignore[reportIncompatibleVariableOverride] Timedelta ] value: int def __new__( cls, ts_input: np.integer | float | str | _date | datetime | np.datetime64 = ..., year: int | None = ..., month: int | None = ..., day: int | None = ..., hour: int | None = ..., minute: int | None = ..., second: int | None = ..., microsecond: int | None = ..., tzinfo: _tzinfo | None = ..., *, nanosecond: int | None = ..., tz: TimeZones = ..., unit: str | int | None = ..., fold: Literal[0, 1] | None = ..., ) -> Self: ... # GH 46171 # While Timestamp can return pd.NaT, having the constructor return # a Union with NaTType makes things awkward for users of pandas @property def year(self) -> int: ... @property def month(self) -> int: ... @property def day(self) -> int: ... @property def hour(self) -> int: ... @property def minute(self) -> int: ... @property def second(self) -> int: ... @property def microsecond(self) -> int: ... @property def nanosecond(self) -> int: ... @property def tzinfo(self) -> _tzinfo | None: ... @property def tz(self) -> _tzinfo | None: ... @property def fold(self) -> int: ... if sys.version_info >= (3, 12): @classmethod def fromtimestamp( # pyright: ignore[reportIncompatibleMethodOverride] # pyrefly: ignore cls, t: float, tz: _tzinfo | str | None = ... ) -> Self: ... else: @classmethod def fromtimestamp(cls, t: float, tz: _tzinfo | str | None = ...) -> Self: ... @classmethod def utcfromtimestamp(cls, ts: float) -> Self: ... @classmethod def today(cls, tz: _tzinfo | str | None = None) -> Self: ... @classmethod def fromordinal( cls, ordinal: int, tz: _tzinfo | str | None = ..., ) -> Self: ... @classmethod def now(cls, tz: _tzinfo | str | None = None) -> Self: ... @classmethod def utcnow(cls) -> Self: ... # error: Signature of "combine" incompatible with supertype "datetime" @classmethod def combine(cls, date: _date, time: _time) -> Self: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] @classmethod def fromisoformat(cls, date_string: str) -> Self: ... def strftime(self, format: str) -> str: ... def __format__(self, fmt: str) -> str: ... def toordinal(self) -> int: ... def timetuple(self) -> struct_time: ... def timestamp(self) -> float: ... def utctimetuple(self) -> struct_time: ... def date(self) -> _date: ... def time(self) -> _time: ... def timetz(self) -> _time: ... # Override since fold is more precise than datetime.replace(fold:int) # Here it is restricted to be 0 or 1 using a Literal # Violation of Liskov substitution principle def replace( # type:ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] # pyrefly: ignore self, year: int | None = ..., month: int | None = ..., day: int | None = ..., hour: int | None = ..., minute: int | None = ..., second: int | None = ..., microsecond: int | None = ..., tzinfo: _tzinfo | None = ..., fold: Literal[0, 1] | None = ..., ) -> Timestamp: ... def astimezone(self, tz: _tzinfo | None = ...) -> Self: ... def ctime(self) -> str: ... def isoformat( # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] self, sep: str = "T", timespec: Literal[ "auto", "hours", "minutes", "seconds", "milliseconds", "microseconds", "nanoseconds", ] = "auto", ) -> str: ... @classmethod def strptime(cls, date_string: Never, format: Never) -> Never: ... # type: ignore[override] # pyright: ignore[reportIncompatibleMethodOverride] def utcoffset(self) -> timedelta | None: ... def tzname(self) -> str | None: ... def dst(self) -> timedelta | None: ... # Mypy complains Forward operator "" is not callable, so ignore misc # for le, lt ge and gt @overload # type: ignore[override] def __le__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc] @overload def __le__(self, other: DatetimeIndex) -> np_1darray[np.bool]: ... @overload def __le__( self, other: np_ndarray[ShapeT, np.datetime64] ) -> np_ndarray[ShapeT, np.bool]: ... @overload def __le__(self, other: TimestampSeries) -> Series[bool]: ... @overload # type: ignore[override] def __lt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc] @overload def __lt__(self, other: DatetimeIndex) -> np_1darray[np.bool]: ... @overload def __lt__( self, other: np_ndarray[ShapeT, np.datetime64] ) -> np_ndarray[ShapeT, np.bool]: ... @overload def __lt__(self, other: TimestampSeries) -> Series[bool]: ... @overload # type: ignore[override] def __ge__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc] @overload def __ge__(self, other: DatetimeIndex) -> np_1darray[np.bool]: ... @overload def __ge__( self, other: np_ndarray[ShapeT, np.datetime64] ) -> np_ndarray[ShapeT, np.bool]: ... @overload def __ge__(self, other: TimestampSeries) -> Series[bool]: ... @overload # type: ignore[override] def __gt__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[misc] @overload def __gt__(self, other: DatetimeIndex) -> np_1darray[np.bool]: ... @overload def __gt__( self, other: np_ndarray[ShapeT, np.datetime64] ) -> np_ndarray[ShapeT, np.bool]: ... @overload def __gt__(self, other: TimestampSeries) -> Series[bool]: ... # error: Signature of "__add__" incompatible with supertype "date"/"datetime" @overload # type: ignore[override] def __add__( self, other: np_ndarray[ShapeT, np.timedelta64] ) -> np_ndarray[ShapeT, np.datetime64]: ... @overload def __add__(self, other: timedelta | np.timedelta64 | Tick) -> Self: ... @overload def __add__(self, other: TimedeltaSeries) -> TimestampSeries: ... @overload def __add__(self, other: TimedeltaIndex) -> DatetimeIndex: ... @overload def __radd__(self, other: timedelta) -> Self: ... @overload def __radd__(self, other: TimedeltaIndex) -> DatetimeIndex: ... @overload def __radd__( self, other: np_ndarray[ShapeT, np.timedelta64] ) -> np_ndarray[ShapeT, np.datetime64]: ... # TODO: test dt64 @overload # type: ignore[override] def __sub__(self, other: Timestamp | datetime | np.datetime64) -> Timedelta: ... @overload def __sub__(self, other: timedelta | np.timedelta64 | Tick) -> Self: ... @overload def __sub__(self, other: TimedeltaIndex) -> DatetimeIndex: ... @overload def __sub__(self, other: TimedeltaSeries) -> TimestampSeries: ... @overload def __sub__(self, other: TimestampSeries) -> TimedeltaSeries: ... @overload def __sub__( self, other: np_ndarray[ShapeT, np.timedelta64] ) -> np_ndarray[ShapeT, np.datetime64]: ... @overload def __eq__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] @overload def __eq__(self, other: TimestampSeries) -> Series[bool]: ... # type: ignore[overload-overlap] @overload def __eq__(self, other: Index) -> np_1darray[np.bool]: ... # type: ignore[overload-overlap] @overload def __eq__(self, other: np_ndarray[ShapeT, np.datetime64]) -> np_ndarray[ShapeT, np.bool]: ... # type: ignore[overload-overlap] @overload def __eq__(self, other: object) -> Literal[False]: ... @overload def __ne__(self, other: Timestamp | datetime | np.datetime64) -> bool: ... # type: ignore[overload-overlap] # pyright: ignore[reportOverlappingOverload] @overload def __ne__(self, other: TimestampSeries) -> Series[bool]: ... # type: ignore[overload-overlap] @overload def __ne__(self, other: Index) -> np_1darray[np.bool]: ... # type: ignore[overload-overlap] @overload def __ne__(self, other: np_ndarray[ShapeT, np.datetime64]) -> np_ndarray[ShapeT, np.bool]: ... # type: ignore[overload-overlap] @overload def __ne__(self, other: object) -> Literal[True]: ... def __hash__(self) -> int: ... def weekday(self) -> int: ... def isoweekday(self) -> int: ... def isocalendar(self) -> _IsoCalendarDate: ... @property def is_leap_year(self) -> bool: ... @property def is_month_start(self) -> bool: ... @property def is_quarter_start(self) -> bool: ... @property def is_year_start(self) -> bool: ... @property def is_month_end(self) -> bool: ... @property def is_quarter_end(self) -> bool: ... @property def is_year_end(self) -> bool: ... def to_pydatetime(self, warn: bool = ...) -> datetime: ... def to_datetime64(self) -> np.datetime64: ... def to_period(self, freq: BaseOffset | str | None = ...) -> Period: ... def to_julian_date(self) -> np.float64: ... @property def asm8(self) -> np.datetime64: ... def tz_convert(self, tz: TimeZones) -> Self: ... # TODO: could return NaT? def tz_localize( self, tz: TimeZones, ambiguous: _Ambiguous = "raise", nonexistent: TimestampNonexistent = "raise", ) -> Self: ... def normalize(self) -> Self: ... # TODO: round/floor/ceil could return NaT? def round( self, freq: str, ambiguous: _Ambiguous = "raise", nonexistent: TimestampNonexistent = "raise", ) -> Self: ... def floor( self, freq: str, ambiguous: _Ambiguous = "raise", nonexistent: TimestampNonexistent = "raise", ) -> Self: ... def ceil( self, freq: str, ambiguous: _Ambiguous = "raise", nonexistent: TimestampNonexistent = "raise", ) -> Self: ... def day_name(self, locale: str | None = None) -> str: ... def month_name(self, locale: str | None = None) -> str: ... @property def day_of_week(self) -> int: ... @property def dayofweek(self) -> int: ... @property def day_of_year(self) -> int: ... @property def dayofyear(self) -> int: ... @property def weekofyear(self) -> int: ... @property def quarter(self) -> int: ... @property def week(self) -> int: ... def to_numpy(self) -> np.datetime64: ... @property def days_in_month(self) -> int: ... @property def daysinmonth(self) -> int: ... @property def unit(self) -> TimeUnit: ... def as_unit(self, unit: TimeUnit, round_ok: bool = True) -> Self: ... # To support slicing def __index__(self) -> int: ...