From 64983c01c7cd3e04a4995f9e636e4b80e2f29b82 Mon Sep 17 00:00:00 2001 From: saldanhad Date: Wed, 25 Sep 2024 15:03:45 +0530 Subject: [PATCH 1/5] fix docstrings -Timedelta/Timedeltaindex --- ci/code_checks.sh | 2 -- pandas/_libs/tslibs/timedeltas.pyx | 10 +++++++++- pandas/core/arrays/timedeltas.py | 15 +++++++++++++-- 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/ci/code_checks.sh b/ci/code_checks.sh index 21104c2e00450..db079f738c019 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -104,8 +104,6 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.Timedelta.max PR02" \ -i "pandas.Timedelta.min PR02" \ -i "pandas.Timedelta.resolution PR02" \ - -i "pandas.Timedelta.to_timedelta64 SA01" \ - -i "pandas.TimedeltaIndex.to_pytimedelta RT03,SA01" \ -i "pandas.Timestamp.max PR02" \ -i "pandas.Timestamp.min PR02" \ -i "pandas.Timestamp.nanosecond GL08" \ diff --git a/pandas/_libs/tslibs/timedeltas.pyx b/pandas/_libs/tslibs/timedeltas.pyx index 0ff5c5fb81df8..53aef82ccfd8a 100644 --- a/pandas/_libs/tslibs/timedeltas.pyx +++ b/pandas/_libs/tslibs/timedeltas.pyx @@ -1409,7 +1409,15 @@ cdef class _Timedelta(timedelta): def to_timedelta64(self) -> np.timedelta64: """ - Return a numpy.timedelta64 object with 'ns' precision. + Return a numpy.timedelta64 object with ``ns`` (nanosecond) precision. + + See Also + -------- + to_timedelta : Convert argument to timedelta format. + DatetimeIndex: Index of datetime64 data. + TimedeltaIndex : Index of timedelta64 data, representing durations. + Timedelta.components : Return a components namedtuple-like + of a single timedelta. Examples -------- diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 754ae277e359a..95d3db3c3f813 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -785,11 +785,22 @@ def total_seconds(self) -> npt.NDArray[np.float64]: def to_pytimedelta(self) -> npt.NDArray[np.object_]: """ - Return an ndarray of datetime.timedelta objects. + Return an ndarray of ``datetime.timedelta`` objects. Returns ------- - numpy.ndarray + **numpy.ndarray** + An ``numpy.ndarray`` of ``datetime.timedelta`` objects, + corresponding to each entry. + + See Also + -------- + to_timedelta : Convert argument to timedelta format. + Timedelta : Represents a duration between two dates or times. + DatetimeIndex: Index of datetime64 data. + TimedeltaIndex.total_seconds : Return total duration expressed in seconds. + Timedelta.components : Return a components namedtuple-like + of a single timedelta. Examples -------- From 88fa4381eb637e0b1010fcb06b48bd0a322cd11c Mon Sep 17 00:00:00 2001 From: saldanhad Date: Wed, 25 Sep 2024 17:56:14 +0530 Subject: [PATCH 2/5] update timedeltas.py --- pandas/core/arrays/timedeltas.py | 1 - 1 file changed, 1 deletion(-) diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 95d3db3c3f813..7f3e47b968feb 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -798,7 +798,6 @@ def to_pytimedelta(self) -> npt.NDArray[np.object_]: to_timedelta : Convert argument to timedelta format. Timedelta : Represents a duration between two dates or times. DatetimeIndex: Index of datetime64 data. - TimedeltaIndex.total_seconds : Return total duration expressed in seconds. Timedelta.components : Return a components namedtuple-like of a single timedelta. From 5305e5257f2eecd4409de6433c5d6bc95b219a08 Mon Sep 17 00:00:00 2001 From: saldanhad Date: Thu, 26 Sep 2024 17:24:12 +0530 Subject: [PATCH 3/5] rm changes timedeltas.pyx, update timedeltas.py --- ci/code_checks.sh | 17 +++++++++++++++++ pandas/_libs/tslibs/timedeltas.pyx | 29 +---------------------------- pandas/core/arrays/timedeltas.py | 15 +++++++++++++-- 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/ci/code_checks.sh b/ci/code_checks.sh index db079f738c019..365667d6b5fbb 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -70,8 +70,10 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then --format=actions \ -i ES01 `# For now it is ok if docstrings are missing the extended summary` \ -i "pandas.Series.dt PR01" `# Accessors are implemented as classes, but we do not document the Parameters section` \ + -i "pandas.NA SA01" \ -i "pandas.Period.freq GL08" \ -i "pandas.Period.ordinal GL08" \ + -i "pandas.PeriodDtype.freq SA01" \ -i "pandas.RangeIndex.from_range PR01,SA01" \ -i "pandas.RangeIndex.step SA01" \ -i "pandas.Series.cat.add_categories PR01,PR02" \ @@ -101,9 +103,12 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.Series.sparse.from_coo PR07,SA01" \ -i "pandas.Series.sparse.npoints SA01" \ -i "pandas.Series.sparse.sp_values SA01" \ + -i "pandas.Timedelta.components SA01" \ -i "pandas.Timedelta.max PR02" \ -i "pandas.Timedelta.min PR02" \ -i "pandas.Timedelta.resolution PR02" \ + -i "pandas.Timedelta.to_timedelta64 SA01" \ + -i "pandas.Timedelta.total_seconds SA01" \ -i "pandas.Timestamp.max PR02" \ -i "pandas.Timestamp.min PR02" \ -i "pandas.Timestamp.nanosecond GL08" \ @@ -111,12 +116,14 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.Timestamp.tzinfo GL08" \ -i "pandas.Timestamp.year GL08" \ -i "pandas.api.types.is_dict_like PR07,SA01" \ + -i "pandas.api.types.is_extension_array_dtype SA01" \ -i "pandas.api.types.is_file_like PR07,SA01" \ -i "pandas.api.types.is_float PR01,SA01" \ -i "pandas.api.types.is_float_dtype SA01" \ -i "pandas.api.types.is_hashable PR01,RT03,SA01" \ -i "pandas.api.types.is_int64_dtype SA01" \ -i "pandas.api.types.is_integer PR01,SA01" \ + -i "pandas.api.types.is_integer_dtype SA01" \ -i "pandas.api.types.is_interval_dtype SA01" \ -i "pandas.api.types.is_iterator PR07,SA01" \ -i "pandas.api.types.is_list_like SA01" \ @@ -128,6 +135,7 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.arrays.ArrowExtensionArray PR07,SA01" \ -i "pandas.arrays.BooleanArray SA01" \ -i "pandas.arrays.DatetimeArray SA01" \ + -i "pandas.arrays.FloatingArray SA01" \ -i "pandas.arrays.IntegerArray SA01" \ -i "pandas.arrays.IntervalArray.left SA01" \ -i "pandas.arrays.IntervalArray.length SA01" \ @@ -142,12 +150,16 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.core.groupby.DataFrameGroupBy.boxplot PR07,RT03,SA01" \ -i "pandas.core.groupby.DataFrameGroupBy.get_group RT03,SA01" \ -i "pandas.core.groupby.DataFrameGroupBy.groups SA01" \ + -i "pandas.core.groupby.DataFrameGroupBy.hist RT03" \ -i "pandas.core.groupby.DataFrameGroupBy.indices SA01" \ + -i "pandas.core.groupby.DataFrameGroupBy.max SA01" \ + -i "pandas.core.groupby.DataFrameGroupBy.min SA01" \ -i "pandas.core.groupby.DataFrameGroupBy.nth PR02" \ -i "pandas.core.groupby.DataFrameGroupBy.nunique SA01" \ -i "pandas.core.groupby.DataFrameGroupBy.ohlc SA01" \ -i "pandas.core.groupby.DataFrameGroupBy.plot PR02" \ -i "pandas.core.groupby.DataFrameGroupBy.sem SA01" \ + -i "pandas.core.groupby.DataFrameGroupBy.sum SA01" \ -i "pandas.core.groupby.SeriesGroupBy.__iter__ RT03,SA01" \ -i "pandas.core.groupby.SeriesGroupBy.agg RT03" \ -i "pandas.core.groupby.SeriesGroupBy.aggregate RT03" \ @@ -156,10 +168,13 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.core.groupby.SeriesGroupBy.indices SA01" \ -i "pandas.core.groupby.SeriesGroupBy.is_monotonic_decreasing SA01" \ -i "pandas.core.groupby.SeriesGroupBy.is_monotonic_increasing SA01" \ + -i "pandas.core.groupby.SeriesGroupBy.max SA01" \ + -i "pandas.core.groupby.SeriesGroupBy.min SA01" \ -i "pandas.core.groupby.SeriesGroupBy.nth PR02" \ -i "pandas.core.groupby.SeriesGroupBy.ohlc SA01" \ -i "pandas.core.groupby.SeriesGroupBy.plot PR02" \ -i "pandas.core.groupby.SeriesGroupBy.sem SA01" \ + -i "pandas.core.groupby.SeriesGroupBy.sum SA01" \ -i "pandas.core.resample.Resampler.__iter__ RT03,SA01" \ -i "pandas.core.resample.Resampler.ffill RT03" \ -i "pandas.core.resample.Resampler.get_group RT03,SA01" \ @@ -188,6 +203,7 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.errors.IntCastingNaNError SA01" \ -i "pandas.errors.InvalidIndexError SA01" \ -i "pandas.errors.InvalidVersion SA01" \ + -i "pandas.errors.MergeError SA01" \ -i "pandas.errors.NullFrequencyError SA01" \ -i "pandas.errors.NumExprClobberingError SA01" \ -i "pandas.errors.NumbaUtilError SA01" \ @@ -380,6 +396,7 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.tseries.offsets.Week.n GL08" \ -i "pandas.tseries.offsets.Week.normalize GL08" \ -i "pandas.tseries.offsets.Week.weekday GL08" \ + -i "pandas.tseries.offsets.WeekOfMonth SA01" \ -i "pandas.tseries.offsets.WeekOfMonth.is_on_offset GL08" \ -i "pandas.tseries.offsets.WeekOfMonth.n GL08" \ -i "pandas.tseries.offsets.WeekOfMonth.normalize GL08" \ diff --git a/pandas/_libs/tslibs/timedeltas.pyx b/pandas/_libs/tslibs/timedeltas.pyx index 53aef82ccfd8a..4f90f26cf31ab 100644 --- a/pandas/_libs/tslibs/timedeltas.pyx +++ b/pandas/_libs/tslibs/timedeltas.pyx @@ -1189,14 +1189,6 @@ cdef class _Timedelta(timedelta): """ Total seconds in the duration. - This method calculates the total duration in seconds by combining - the days, seconds, and microseconds of the `Timedelta` object. - - See Also - -------- - to_timedelta : Convert argument to timedelta. - Timedelta : Represents a duration, the difference between two dates or times. - Examples -------- >>> td = pd.Timedelta('1min') @@ -1409,15 +1401,7 @@ cdef class _Timedelta(timedelta): def to_timedelta64(self) -> np.timedelta64: """ - Return a numpy.timedelta64 object with ``ns`` (nanosecond) precision. - - See Also - -------- - to_timedelta : Convert argument to timedelta format. - DatetimeIndex: Index of datetime64 data. - TimedeltaIndex : Index of timedelta64 data, representing durations. - Timedelta.components : Return a components namedtuple-like - of a single timedelta. + Return a numpy.timedelta64 object with 'ns' precision. Examples -------- @@ -1509,17 +1493,6 @@ cdef class _Timedelta(timedelta): """ Return a components namedtuple-like. - Each component represents a different time unit, allowing you to access the - breakdown of the total duration in terms of days, hours, minutes, seconds, - milliseconds, microseconds, and nanoseconds. - - See Also - -------- - Timedelta.total_seconds : Returns the total duration of the Timedelta in - seconds. - to_timedelta : Convert argument to Timedelta. - Timedelta : Represents a duration, the difference between two dates or times. - Examples -------- >>> td = pd.Timedelta('2 day 4 min 3 us 42 ns') diff --git a/pandas/core/arrays/timedeltas.py b/pandas/core/arrays/timedeltas.py index 7f3e47b968feb..04ea887ca047b 100644 --- a/pandas/core/arrays/timedeltas.py +++ b/pandas/core/arrays/timedeltas.py @@ -790,8 +790,11 @@ def to_pytimedelta(self) -> npt.NDArray[np.object_]: Returns ------- **numpy.ndarray** - An ``numpy.ndarray`` of ``datetime.timedelta`` objects, - corresponding to each entry. + A NumPy ``timedelta64`` object representing the same duration as the + original pandas ``Timedelta`` object. The precision of the resulting + object is in nanoseconds, which is the default + time resolution used by pandas for ``Timedelta`` objects, ensuring + high precision for time-based calculations. See Also -------- @@ -810,6 +813,14 @@ def to_pytimedelta(self) -> npt.NDArray[np.object_]: >>> tdelta_idx.to_pytimedelta() array([datetime.timedelta(days=1), datetime.timedelta(days=2), datetime.timedelta(days=3)], dtype=object) + + >>> tidx = pd.TimedeltaIndex(data=["1 days 02:30:45", "3 days 04:15:10"]) + >>> tidx + TimedeltaIndex(['1 days 02:30:45', '3 days 04:15:10'], + dtype='timedelta64[ns]', freq=None) + >>> tidx.to_pytimedelta() + array([datetime.timedelta(days=1, seconds=9045), + datetime.timedelta(days=3, seconds=15310)], dtype=object) """ return ints_to_pytimedelta(self._ndarray) From 6a942510f9851d6a6d183f65cb99b08d08ec9101 Mon Sep 17 00:00:00 2001 From: saldanhad Date: Thu, 26 Sep 2024 17:46:42 +0530 Subject: [PATCH 4/5] code_checks.sh --- ci/code_checks.sh | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/ci/code_checks.sh b/ci/code_checks.sh index 365667d6b5fbb..42c70c1f88a9c 100755 --- a/ci/code_checks.sh +++ b/ci/code_checks.sh @@ -75,7 +75,6 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.Period.ordinal GL08" \ -i "pandas.PeriodDtype.freq SA01" \ -i "pandas.RangeIndex.from_range PR01,SA01" \ - -i "pandas.RangeIndex.step SA01" \ -i "pandas.Series.cat.add_categories PR01,PR02" \ -i "pandas.Series.cat.as_ordered PR01" \ -i "pandas.Series.cat.as_unordered PR01" \ @@ -99,16 +98,11 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.Series.dt.tz_localize PR01,PR02" \ -i "pandas.Series.dt.unit GL08" \ -i "pandas.Series.pad PR01,SA01" \ - -i "pandas.Series.sparse.fill_value SA01" \ -i "pandas.Series.sparse.from_coo PR07,SA01" \ -i "pandas.Series.sparse.npoints SA01" \ - -i "pandas.Series.sparse.sp_values SA01" \ - -i "pandas.Timedelta.components SA01" \ -i "pandas.Timedelta.max PR02" \ -i "pandas.Timedelta.min PR02" \ -i "pandas.Timedelta.resolution PR02" \ - -i "pandas.Timedelta.to_timedelta64 SA01" \ - -i "pandas.Timedelta.total_seconds SA01" \ -i "pandas.Timestamp.max PR02" \ -i "pandas.Timestamp.min PR02" \ -i "pandas.Timestamp.nanosecond GL08" \ @@ -119,27 +113,19 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.api.types.is_extension_array_dtype SA01" \ -i "pandas.api.types.is_file_like PR07,SA01" \ -i "pandas.api.types.is_float PR01,SA01" \ - -i "pandas.api.types.is_float_dtype SA01" \ -i "pandas.api.types.is_hashable PR01,RT03,SA01" \ - -i "pandas.api.types.is_int64_dtype SA01" \ -i "pandas.api.types.is_integer PR01,SA01" \ - -i "pandas.api.types.is_integer_dtype SA01" \ - -i "pandas.api.types.is_interval_dtype SA01" \ -i "pandas.api.types.is_iterator PR07,SA01" \ - -i "pandas.api.types.is_list_like SA01" \ -i "pandas.api.types.is_named_tuple PR07,SA01" \ - -i "pandas.api.types.is_object_dtype SA01" \ -i "pandas.api.types.is_re PR07,SA01" \ -i "pandas.api.types.is_re_compilable PR07,SA01" \ -i "pandas.api.types.pandas_dtype PR07,RT03,SA01" \ -i "pandas.arrays.ArrowExtensionArray PR07,SA01" \ - -i "pandas.arrays.BooleanArray SA01" \ -i "pandas.arrays.DatetimeArray SA01" \ -i "pandas.arrays.FloatingArray SA01" \ -i "pandas.arrays.IntegerArray SA01" \ -i "pandas.arrays.IntervalArray.left SA01" \ -i "pandas.arrays.IntervalArray.length SA01" \ - -i "pandas.arrays.IntervalArray.mid SA01" \ -i "pandas.arrays.IntervalArray.right SA01" \ -i "pandas.arrays.NumpyExtensionArray SA01" \ -i "pandas.arrays.SparseArray PR07,SA01" \ @@ -176,7 +162,6 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.core.groupby.SeriesGroupBy.sem SA01" \ -i "pandas.core.groupby.SeriesGroupBy.sum SA01" \ -i "pandas.core.resample.Resampler.__iter__ RT03,SA01" \ - -i "pandas.core.resample.Resampler.ffill RT03" \ -i "pandas.core.resample.Resampler.get_group RT03,SA01" \ -i "pandas.core.resample.Resampler.groups SA01" \ -i "pandas.core.resample.Resampler.indices SA01" \ @@ -191,7 +176,6 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.core.resample.Resampler.sum SA01" \ -i "pandas.core.resample.Resampler.transform PR01,RT03,SA01" \ -i "pandas.core.resample.Resampler.var SA01" \ - -i "pandas.date_range RT03" \ -i "pandas.errors.AttributeConflictWarning SA01" \ -i "pandas.errors.CSSWarning SA01" \ -i "pandas.errors.CategoricalConversionWarning SA01" \ @@ -199,7 +183,6 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.errors.ClosedFileError SA01" \ -i "pandas.errors.DataError SA01" \ -i "pandas.errors.DuplicateLabelError SA01" \ - -i "pandas.errors.EmptyDataError SA01" \ -i "pandas.errors.IntCastingNaNError SA01" \ -i "pandas.errors.InvalidIndexError SA01" \ -i "pandas.errors.InvalidVersion SA01" \ @@ -382,7 +365,6 @@ if [[ -z "$CHECK" || "$CHECK" == "docstrings" ]]; then -i "pandas.tseries.offsets.SemiMonthBegin.n GL08" \ -i "pandas.tseries.offsets.SemiMonthBegin.normalize GL08" \ -i "pandas.tseries.offsets.SemiMonthBegin.rule_code GL08" \ - -i "pandas.tseries.offsets.SemiMonthEnd SA01" \ -i "pandas.tseries.offsets.SemiMonthEnd.day_of_month GL08" \ -i "pandas.tseries.offsets.SemiMonthEnd.is_on_offset GL08" \ -i "pandas.tseries.offsets.SemiMonthEnd.n GL08" \ From f5d9af316552a940a3c56e60c856a62d19e92f54 Mon Sep 17 00:00:00 2001 From: saldanhad Date: Thu, 26 Sep 2024 18:24:25 +0530 Subject: [PATCH 5/5] resolve ci --- pandas/_testing/contexts.py | 17 +++++++++-------- pandas/tests/tslibs/test_parsing.py | 11 +++++++---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/pandas/_testing/contexts.py b/pandas/_testing/contexts.py index 91b5d2a981bef..4ca67d6fc082d 100644 --- a/pandas/_testing/contexts.py +++ b/pandas/_testing/contexts.py @@ -73,14 +73,15 @@ def set_timezone(tz: str) -> Generator[None, None, None]: import time def setTZ(tz) -> None: - if tz is None: - try: - del os.environ["TZ"] - except KeyError: - pass - else: - os.environ["TZ"] = tz - time.tzset() + if hasattr(time, "tzset"): + if tz is None: + try: + del os.environ["TZ"] + except KeyError: + pass + else: + os.environ["TZ"] = tz + time.tzset() orig_tz = os.environ.get("TZ") setTZ(tz) diff --git a/pandas/tests/tslibs/test_parsing.py b/pandas/tests/tslibs/test_parsing.py index 9b64beaf09273..07425af8ed37a 100644 --- a/pandas/tests/tslibs/test_parsing.py +++ b/pandas/tests/tslibs/test_parsing.py @@ -37,10 +37,13 @@ ) def test_parsing_tzlocal_deprecated(): # GH#50791 - msg = ( - r"Parsing 'EST' as tzlocal \(dependent on system timezone\) " - r"is no longer supported\. " - "Pass the 'tz' keyword or call tz_localize after construction instead" + msg = "|".join( + [ + r"Parsing 'EST' as tzlocal \(dependent on system timezone\) " + r"is no longer supported\. " + "Pass the 'tz' keyword or call tz_localize after construction instead", + ".*included an un-recognized timezone", + ] ) dtstr = "Jan 15 2004 03:00 EST"