Skip to content

Commit 43562f6

Browse files
author
MarcoGorelli
committed
simplify
1 parent 3aa9d23 commit 43562f6

File tree

5 files changed

+50
-44
lines changed

5 files changed

+50
-44
lines changed

pandas/_libs/tslibs/parsing.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ def _does_string_look_like_datetime(py_string: str) -> bool: ...
2323
def quarter_to_myear(year: int, quarter: int, freq: str) -> tuple[int, int]: ...
2424
def try_parse_dates(
2525
values: npt.NDArray[np.object_], # object[:]
26-
parser=...,
26+
parser,
2727
dayfirst: bool = ...,
2828
default: datetime | None = ...,
2929
) -> npt.NDArray[np.object_]: ...

pandas/_libs/tslibs/parsing.pyx

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -661,7 +661,7 @@ cdef dateutil_parse(
661661

662662

663663
def try_parse_dates(
664-
object[:] values, parser=None, bint dayfirst=False, default=None,
664+
object[:] values, parser, bint dayfirst=False, default=None,
665665
) -> np.ndarray:
666666
cdef:
667667
Py_ssize_t i, n
@@ -670,32 +670,11 @@ def try_parse_dates(
670670
n = len(values)
671671
result = np.empty(n, dtype="O")
672672

673-
if parser is None:
674-
if default is None: # GH2618
675-
date = datetime.now()
676-
default = datetime(date.year, date.month, 1)
677-
678-
def parse_date(x):
679-
return du_parse(x, dayfirst=dayfirst, default=default)
680-
681-
# EAFP here
682-
try:
683-
for i in range(n):
684-
if values[i] == "":
685-
result[i] = np.nan
686-
else:
687-
result[i] = parse_date(values[i])
688-
except Exception:
689-
# Since parser is user-defined, we can't guess what it might raise
690-
return values
691-
else:
692-
parse_date = parser
693-
694-
for i in range(n):
695-
if values[i] == "":
696-
result[i] = np.nan
697-
else:
698-
result[i] = parse_date(values[i])
673+
for i in range(n):
674+
if values[i] == "":
675+
result[i] = np.nan
676+
else:
677+
result[i] = parser(values[i])
699678

700679
return result.base # .base to access underlying ndarray
701680

pandas/io/parsers/base_parser.py

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,19 +1119,13 @@ def converter(*date_cols):
11191119
if date_parser is None:
11201120
strs = parsing.concat_date_cols(date_cols)
11211121

1122-
try:
1123-
return tools.to_datetime(
1124-
ensure_object(strs),
1125-
utc=False,
1126-
dayfirst=dayfirst,
1127-
errors="ignore",
1128-
cache=cache_dates,
1129-
).to_numpy()
1130-
1131-
except ValueError:
1132-
return tools.to_datetime(
1133-
parsing.try_parse_dates(strs, dayfirst=dayfirst), cache=cache_dates
1134-
)
1122+
return tools.to_datetime(
1123+
ensure_object(strs),
1124+
utc=False,
1125+
dayfirst=dayfirst,
1126+
errors="ignore",
1127+
cache=cache_dates,
1128+
).to_numpy()
11351129
else:
11361130
try:
11371131
result = tools.to_datetime(

pandas/tests/io/parser/test_parse_dates.py

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,9 @@ def date_parser(*date_cols):
166166
-------
167167
parsed : Series
168168
"""
169-
return parsing.try_parse_dates(parsing.concat_date_cols(date_cols))
169+
return parsing.try_parse_dates(
170+
parsing.concat_date_cols(date_cols), parser=du_parse
171+
)
170172

171173
kwds = {
172174
"header": None,
@@ -2027,3 +2029,31 @@ def test_parse_dates_and_string_dtype(all_parsers):
20272029
expected = DataFrame({"a": ["1"], "b": [Timestamp("2019-12-31")]})
20282030
expected["a"] = expected["a"].astype("string")
20292031
tm.assert_frame_equal(result, expected)
2032+
2033+
2034+
def test_parse_dot_separated_dates(all_parsers):
2035+
# https://github.com/pandas-dev/pandas/issues/2586
2036+
parser = all_parsers
2037+
data = """a,b
2038+
27.03.2003 14:55:00.000,1
2039+
03.08.2003 15:20:00.000,2"""
2040+
if parser.engine == "pyarrow":
2041+
expected_index = Index(
2042+
["27.03.2003 14:55:00.000", "03.08.2003 15:20:00.000"],
2043+
dtype="object",
2044+
name="a",
2045+
)
2046+
warn = None
2047+
else:
2048+
expected_index = DatetimeIndex(
2049+
["2003-03-27 14:55:00", "2003-08-03 15:20:00"],
2050+
dtype="datetime64[ns]",
2051+
name="a",
2052+
)
2053+
warn = UserWarning
2054+
msg = "when dayfirst=False was specified"
2055+
result = parser.read_csv_check_warnings(
2056+
warn, msg, StringIO(data), parse_dates=True, index_col=0
2057+
)
2058+
expected = DataFrame({"b": [1, 2]}, index=expected_index)
2059+
tm.assert_frame_equal(result, expected)

pandas/tests/tslibs/test_parsing.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
from datetime import datetime
55
import re
66

7-
from dateutil.parser import parse
7+
from dateutil.parser import (
8+
parse,
9+
parse as du_parse,
10+
)
811
import numpy as np
912
import pytest
1013

@@ -268,7 +271,7 @@ def test_guess_datetime_format_no_padding(string, fmt, dayfirst, warning):
268271

269272
def test_try_parse_dates():
270273
arr = np.array(["5/1/2000", "6/1/2000", "7/1/2000"], dtype=object)
271-
result = parsing.try_parse_dates(arr, dayfirst=True)
274+
result = parsing.try_parse_dates(arr, dayfirst=True, parser=du_parse)
272275

273276
expected = np.array([parse(d, dayfirst=True) for d in arr])
274277
tm.assert_numpy_array_equal(result, expected)

0 commit comments

Comments
 (0)