Skip to content

Commit 99023fc

Browse files
jbrockmendelvladu
authored andcommitted
TYP: tslibs.parsing.pyi (pandas-dev#40576)
1 parent 03b2fb0 commit 99023fc

File tree

4 files changed

+103
-18
lines changed

4 files changed

+103
-18
lines changed

pandas/_libs/tslibs/parsing.pyi

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from datetime import datetime
2+
3+
import numpy as np
4+
5+
from pandas._libs.tslibs.offsets import BaseOffset
6+
7+
class DateParseError(ValueError): ...
8+
9+
10+
def parse_datetime_string(
11+
date_string: str,
12+
dayfirst: bool = ...,
13+
yearfirst: bool = ...,
14+
**kwargs,
15+
) -> datetime: ...
16+
17+
18+
def parse_time_string(
19+
arg: str,
20+
freq: BaseOffset | str | None = ...,
21+
dayfirst: bool | None = ...,
22+
yearfirst: bool | None = ...,
23+
) -> tuple[datetime, str]: ...
24+
25+
26+
def _does_string_look_like_datetime(py_string: str) -> bool: ...
27+
28+
def quarter_to_myear(year: int, quarter: int, freq: str) -> tuple[int, int]: ...
29+
30+
31+
def try_parse_dates(
32+
values: np.ndarray, # object[:]
33+
parser=...,
34+
dayfirst: bool = ...,
35+
default: datetime | None = ...,
36+
) -> np.ndarray: ... # np.ndarray[object]
37+
38+
def try_parse_date_and_time(
39+
dates: np.ndarray, # object[:]
40+
times: np.ndarray, # object[:]
41+
date_parser=...,
42+
time_parser=...,
43+
dayfirst: bool = ...,
44+
default: datetime | None = ...,
45+
) -> np.ndarray: ... # np.ndarray[object]
46+
47+
def try_parse_year_month_day(
48+
years: np.ndarray, # object[:]
49+
months: np.ndarray, # object[:]
50+
days: np.ndarray, # object[:]
51+
) -> np.ndarray: ... # np.ndarray[object]
52+
53+
54+
def try_parse_datetime_components(
55+
years: np.ndarray, # object[:]
56+
months: np.ndarray, # object[:]
57+
days: np.ndarray, # object[:]
58+
hours: np.ndarray, # object[:]
59+
minutes: np.ndarray, # object[:]
60+
seconds: np.ndarray, # object[:]
61+
) -> np.ndarray: ... # np.ndarray[object]
62+
63+
64+
def format_is_iso(f: str) -> bool: ...
65+
66+
67+
def guess_datetime_format(
68+
dt_str,
69+
dayfirst: bool = ...,
70+
dt_str_parse=...,
71+
dt_str_split=...,
72+
) -> str | None: ...
73+
74+
75+
def concat_date_cols(
76+
date_cols: tuple,
77+
keep_trivial_numbers: bool = ...,
78+
) -> np.ndarray: ... # np.ndarray[object]
79+
80+
81+
def get_rule_month(source: str) -> str: ...

pandas/_libs/tslibs/parsing.pyx

+11-7
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ def parse_datetime_string(
219219
bint dayfirst=False,
220220
bint yearfirst=False,
221221
**kwargs,
222-
):
222+
) -> datetime:
223223
"""
224224
Parse datetime string, only returns datetime.
225225
Also cares special handling matching time patterns.
@@ -281,7 +281,9 @@ def parse_time_string(arg: str, freq=None, dayfirst=None, yearfirst=None):
281281
282282
Returns
283283
-------
284-
datetime, datetime/dateutil.parser._result, str
284+
datetime
285+
str
286+
Describing resolution of parsed string.
285287
"""
286288
if is_offset_object(freq):
287289
freq = freq.rule_code
@@ -595,7 +597,7 @@ cdef dateutil_parse(
595597

596598
def try_parse_dates(
597599
object[:] values, parser=None, bint dayfirst=False, default=None,
598-
):
600+
) -> np.ndarray:
599601
cdef:
600602
Py_ssize_t i, n
601603
object[:] result
@@ -639,7 +641,7 @@ def try_parse_date_and_time(
639641
time_parser=None,
640642
bint dayfirst=False,
641643
default=None,
642-
):
644+
) -> np.ndarray:
643645
cdef:
644646
Py_ssize_t i, n
645647
object[:] result
@@ -675,7 +677,9 @@ def try_parse_date_and_time(
675677
return result.base # .base to access underlying ndarray
676678

677679

678-
def try_parse_year_month_day(object[:] years, object[:] months, object[:] days):
680+
def try_parse_year_month_day(
681+
object[:] years, object[:] months, object[:] days
682+
) -> np.ndarray:
679683
cdef:
680684
Py_ssize_t i, n
681685
object[:] result
@@ -697,7 +701,7 @@ def try_parse_datetime_components(object[:] years,
697701
object[:] days,
698702
object[:] hours,
699703
object[:] minutes,
700-
object[:] seconds):
704+
object[:] seconds) -> np.ndarray:
701705

702706
cdef:
703707
Py_ssize_t i, n
@@ -988,7 +992,7 @@ cdef inline object convert_to_unicode(object item, bint keep_trivial_numbers):
988992

989993
@cython.wraparound(False)
990994
@cython.boundscheck(False)
991-
def concat_date_cols(tuple date_cols, bint keep_trivial_numbers=True):
995+
def concat_date_cols(tuple date_cols, bint keep_trivial_numbers=True) -> np.ndarray:
992996
"""
993997
Concatenates elements from numpy arrays in `date_cols` into strings.
994998

pandas/core/indexes/datetimes.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -636,7 +636,7 @@ def _validate_partial_date_slice(self, reso: Resolution):
636636
# See also GH14826
637637
raise KeyError
638638

639-
if reso == "microsecond":
639+
if reso.attrname == "microsecond":
640640
# _partial_date_slice doesn't allow microsecond resolution, but
641641
# _parsed_string_to_bounds allows it.
642642
raise KeyError
@@ -748,11 +748,11 @@ def _maybe_cast_slice_bound(self, label, side: str, kind):
748748
if isinstance(label, str):
749749
freq = getattr(self, "freqstr", getattr(self, "inferred_freq", None))
750750
try:
751-
parsed, reso = parsing.parse_time_string(label, freq)
751+
parsed, reso_str = parsing.parse_time_string(label, freq)
752752
except parsing.DateParseError as err:
753753
raise self._invalid_indexer("slice", label) from err
754754

755-
reso = Resolution.from_attrname(reso)
755+
reso = Resolution.from_attrname(reso_str)
756756
lower, upper = self._parsed_string_to_bounds(reso, parsed)
757757
# lower, upper form the half-open interval:
758758
# [parsed, parsed + 1 freq)
@@ -772,8 +772,8 @@ def _maybe_cast_slice_bound(self, label, side: str, kind):
772772

773773
def _get_string_slice(self, key: str):
774774
freq = getattr(self, "freqstr", getattr(self, "inferred_freq", None))
775-
parsed, reso = parsing.parse_time_string(key, freq)
776-
reso = Resolution.from_attrname(reso)
775+
parsed, reso_str = parsing.parse_time_string(key, freq)
776+
reso = Resolution.from_attrname(reso_str)
777777
return self._partial_date_slice(reso, parsed)
778778

779779
def slice_indexer(self, start=None, end=None, step=None, kind=None):

pandas/core/indexes/period.py

+6-6
Original file line numberDiff line numberDiff line change
@@ -490,12 +490,12 @@ def get_loc(self, key, method=None, tolerance=None):
490490
pass
491491

492492
try:
493-
asdt, reso = parse_time_string(key, self.freq)
493+
asdt, reso_str = parse_time_string(key, self.freq)
494494
except (ValueError, DateParseError) as err:
495495
# A string with invalid format
496496
raise KeyError(f"Cannot interpret '{key}' as period") from err
497497

498-
reso = Resolution.from_attrname(reso)
498+
reso = Resolution.from_attrname(reso_str)
499499
grp = reso.freq_group.value
500500
freqn = self.dtype.freq_group_code
501501

@@ -556,8 +556,8 @@ def _maybe_cast_slice_bound(self, label, side: str, kind: str):
556556
return Period(label, freq=self.freq)
557557
elif isinstance(label, str):
558558
try:
559-
parsed, reso = parse_time_string(label, self.freq)
560-
reso = Resolution.from_attrname(reso)
559+
parsed, reso_str = parse_time_string(label, self.freq)
560+
reso = Resolution.from_attrname(reso_str)
561561
bounds = self._parsed_string_to_bounds(reso, parsed)
562562
return bounds[0 if side == "left" else 1]
563563
except ValueError as err:
@@ -585,8 +585,8 @@ def _validate_partial_date_slice(self, reso: Resolution):
585585
raise ValueError
586586

587587
def _get_string_slice(self, key: str):
588-
parsed, reso = parse_time_string(key, self.freq)
589-
reso = Resolution.from_attrname(reso)
588+
parsed, reso_str = parse_time_string(key, self.freq)
589+
reso = Resolution.from_attrname(reso_str)
590590
try:
591591
return self._partial_date_slice(reso, parsed)
592592
except KeyError as err:

0 commit comments

Comments
 (0)