Skip to content

Commit 7e87385

Browse files
jbrockmendeljreback
authored andcommitted
Separate parsing functions out from tslib (#17363)
1 parent 0d239d9 commit 7e87385

File tree

11 files changed

+721
-642
lines changed

11 files changed

+721
-642
lines changed

pandas/_libs/period.pyx

+3-1
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ from tslibs.timezones cimport (
3737
is_utc, is_tzlocal, get_utcoffset, get_dst_info, maybe_get_tz)
3838
from tslib cimport _nat_scalar_rules
3939

40+
from tslibs.parsing import parse_time_string, NAT_SENTINEL
4041
from tslibs.frequencies cimport get_freq_code
4142

4243
from pandas.tseries import offsets
43-
from pandas.core.tools.datetimes import parse_time_string
4444
from pandas.tseries import frequencies
4545

4646
cdef int64_t NPY_NAT = util.get_nat()
@@ -1197,6 +1197,8 @@ class Period(_Period):
11971197
value = str(value)
11981198
value = value.upper()
11991199
dt, _, reso = parse_time_string(value, freq)
1200+
if dt is NAT_SENTINEL:
1201+
ordinal = iNaT
12001202

12011203
if freq is None:
12021204
try:

pandas/_libs/src/inference.pyx

-159
Original file line numberDiff line numberDiff line change
@@ -1384,165 +1384,6 @@ def convert_sql_column(x):
13841384
return maybe_convert_objects(x, try_float=1)
13851385

13861386

1387-
def try_parse_dates(ndarray[object] values, parser=None,
1388-
dayfirst=False, default=None):
1389-
cdef:
1390-
Py_ssize_t i, n
1391-
ndarray[object] result
1392-
1393-
n = len(values)
1394-
result = np.empty(n, dtype='O')
1395-
1396-
if parser is None:
1397-
if default is None: # GH2618
1398-
date=datetime.now()
1399-
default=datetime(date.year, date.month, 1)
1400-
1401-
try:
1402-
from dateutil.parser import parse
1403-
parse_date = lambda x: parse(x, dayfirst=dayfirst, default=default)
1404-
except ImportError: # pragma: no cover
1405-
def parse_date(s):
1406-
try:
1407-
return datetime.strptime(s, '%m/%d/%Y')
1408-
except Exception:
1409-
return s
1410-
# EAFP here
1411-
try:
1412-
for i from 0 <= i < n:
1413-
if values[i] == '':
1414-
result[i] = np.nan
1415-
else:
1416-
result[i] = parse_date(values[i])
1417-
except Exception:
1418-
# failed
1419-
return values
1420-
else:
1421-
parse_date = parser
1422-
1423-
try:
1424-
for i from 0 <= i < n:
1425-
if values[i] == '':
1426-
result[i] = np.nan
1427-
else:
1428-
result[i] = parse_date(values[i])
1429-
except Exception:
1430-
# raise if passed parser and it failed
1431-
raise
1432-
1433-
return result
1434-
1435-
1436-
def try_parse_date_and_time(ndarray[object] dates, ndarray[object] times,
1437-
date_parser=None, time_parser=None,
1438-
dayfirst=False, default=None):
1439-
cdef:
1440-
Py_ssize_t i, n
1441-
ndarray[object] result
1442-
1443-
from datetime import date, time, datetime, timedelta
1444-
1445-
n = len(dates)
1446-
if len(times) != n:
1447-
raise ValueError('Length of dates and times must be equal')
1448-
result = np.empty(n, dtype='O')
1449-
1450-
if date_parser is None:
1451-
if default is None: # GH2618
1452-
date=datetime.now()
1453-
default=datetime(date.year, date.month, 1)
1454-
1455-
try:
1456-
from dateutil.parser import parse
1457-
parse_date = lambda x: parse(x, dayfirst=dayfirst, default=default)
1458-
except ImportError: # pragma: no cover
1459-
def parse_date(s):
1460-
try:
1461-
return date.strptime(s, '%m/%d/%Y')
1462-
except Exception:
1463-
return s
1464-
else:
1465-
parse_date = date_parser
1466-
1467-
if time_parser is None:
1468-
try:
1469-
from dateutil.parser import parse
1470-
parse_time = lambda x: parse(x)
1471-
except ImportError: # pragma: no cover
1472-
def parse_time(s):
1473-
try:
1474-
return time.strptime(s, '%H:%M:%S')
1475-
except Exception:
1476-
return s
1477-
1478-
else:
1479-
parse_time = time_parser
1480-
1481-
for i from 0 <= i < n:
1482-
d = parse_date(str(dates[i]))
1483-
t = parse_time(str(times[i]))
1484-
result[i] = datetime(d.year, d.month, d.day,
1485-
t.hour, t.minute, t.second)
1486-
1487-
return result
1488-
1489-
1490-
def try_parse_year_month_day(ndarray[object] years, ndarray[object] months,
1491-
ndarray[object] days):
1492-
cdef:
1493-
Py_ssize_t i, n
1494-
ndarray[object] result
1495-
1496-
from datetime import datetime
1497-
1498-
n = len(years)
1499-
if len(months) != n or len(days) != n:
1500-
raise ValueError('Length of years/months/days must all be equal')
1501-
result = np.empty(n, dtype='O')
1502-
1503-
for i from 0 <= i < n:
1504-
result[i] = datetime(int(years[i]), int(months[i]), int(days[i]))
1505-
1506-
return result
1507-
1508-
1509-
def try_parse_datetime_components(ndarray[object] years,
1510-
ndarray[object] months,
1511-
ndarray[object] days,
1512-
ndarray[object] hours,
1513-
ndarray[object] minutes,
1514-
ndarray[object] seconds):
1515-
1516-
cdef:
1517-
Py_ssize_t i, n
1518-
ndarray[object] result
1519-
int secs
1520-
double float_secs
1521-
double micros
1522-
1523-
from datetime import datetime
1524-
1525-
n = len(years)
1526-
if (len(months) != n or len(days) != n or len(hours) != n or
1527-
len(minutes) != n or len(seconds) != n):
1528-
raise ValueError('Length of all datetime components must be equal')
1529-
result = np.empty(n, dtype='O')
1530-
1531-
for i from 0 <= i < n:
1532-
float_secs = float(seconds[i])
1533-
secs = int(float_secs)
1534-
1535-
micros = float_secs - secs
1536-
if micros > 0:
1537-
micros = micros * 1000000
1538-
1539-
result[i] = datetime(int(years[i]), int(months[i]), int(days[i]),
1540-
int(hours[i]), int(minutes[i]), secs,
1541-
int(micros))
1542-
1543-
return result
1544-
1545-
15461387
def sanitize_objects(ndarray[object] values, set na_values,
15471388
convert_empty=True):
15481389
cdef:

0 commit comments

Comments
 (0)