From 8d3864790064c7067dc183281ce987e82989a36f Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 30 Oct 2017 19:34:56 -0700 Subject: [PATCH 1/3] move src/datetime.pxd funcs to np_datetime and fix misleading names --- pandas/_libs/src/datetime.pxd | 22 -------------------- pandas/_libs/tslib.pyx | 22 ++++++++++---------- pandas/_libs/tslibs/np_datetime.pxd | 5 +++++ pandas/_libs/tslibs/np_datetime.pyx | 32 +++++++++++++++++++++++++++++ 4 files changed, 48 insertions(+), 33 deletions(-) diff --git a/pandas/_libs/src/datetime.pxd b/pandas/_libs/src/datetime.pxd index 0c023ed00b2eb..3c542a9d6410c 100644 --- a/pandas/_libs/src/datetime.pxd +++ b/pandas/_libs/src/datetime.pxd @@ -136,28 +136,6 @@ cdef inline int _cstring_to_dts(char *val, int length, return result -cdef inline int64_t _pydatetime_to_dts(object val, pandas_datetimestruct *dts): - dts.year = PyDateTime_GET_YEAR(val) - dts.month = PyDateTime_GET_MONTH(val) - dts.day = PyDateTime_GET_DAY(val) - dts.hour = PyDateTime_DATE_GET_HOUR(val) - dts.min = PyDateTime_DATE_GET_MINUTE(val) - dts.sec = PyDateTime_DATE_GET_SECOND(val) - dts.us = PyDateTime_DATE_GET_MICROSECOND(val) - dts.ps = dts.as = 0 - return pandas_datetimestruct_to_datetime(PANDAS_FR_ns, dts) - - -cdef inline int64_t _date_to_datetime64(object val, - pandas_datetimestruct *dts): - dts.year = PyDateTime_GET_YEAR(val) - dts.month = PyDateTime_GET_MONTH(val) - dts.day = PyDateTime_GET_DAY(val) - dts.hour = dts.min = dts.sec = dts.us = 0 - dts.ps = dts.as = 0 - return pandas_datetimestruct_to_datetime(PANDAS_FR_ns, dts) - - cdef inline bint check_dts_bounds(pandas_datetimestruct *dts): """Returns True if an error needs to be raised""" cdef: diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index af52a18d5dafe..3617836fc5039 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -41,8 +41,8 @@ from datetime cimport ( get_datetime64_unit, PANDAS_DATETIMEUNIT, _string_to_dts, - _pydatetime_to_dts, - _date_to_datetime64, + _pydatetime_to_dt64, + _pydate_to_dt64, npy_datetime, is_leapyear, dayofweek, @@ -1680,7 +1680,7 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz, if (hasattr(tz, 'normalize') and hasattr(ts.tzinfo, '_utcoffset')): ts = tz.normalize(ts) - obj.value = _pydatetime_to_dts(ts, &obj.dts) + obj.value = _pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = ts.tzinfo else: # tzoffset @@ -1688,7 +1688,7 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz, tz = ts.astimezone(tz).tzinfo except: pass - obj.value = _pydatetime_to_dts(ts, &obj.dts) + obj.value = _pydatetime_to_dt64(ts, &obj.dts) ts_offset = get_utcoffset(ts.tzinfo, ts) obj.value -= int(ts_offset.total_seconds() * 1e9) tz_offset = get_utcoffset(tz, ts) @@ -1698,14 +1698,14 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz, obj.tzinfo = tz elif not is_utc(tz): ts = _localize_pydatetime(ts, tz) - obj.value = _pydatetime_to_dts(ts, &obj.dts) + obj.value = _pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = ts.tzinfo else: # UTC - obj.value = _pydatetime_to_dts(ts, &obj.dts) + obj.value = _pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = pytz.utc else: - obj.value = _pydatetime_to_dts(ts, &obj.dts) + obj.value = _pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = ts.tzinfo if obj.tzinfo is not None and not is_utc(obj.tzinfo): @@ -1859,7 +1859,7 @@ def datetime_to_datetime64(ndarray[object] values): if inferred_tz is not None: raise ValueError('Cannot mix tz-aware with ' 'tz-naive values') - iresult[i] = _pydatetime_to_dts(val, &dts) + iresult[i] = _pydatetime_to_dt64(val, &dts) check_dts_bounds(&dts) else: raise TypeError('Unrecognized value type: %s' % type(val)) @@ -2184,7 +2184,7 @@ cpdef array_to_datetime(ndarray[object] values, errors='raise', 'be converted to datetime64 unless ' 'utc=True') else: - iresult[i] = _pydatetime_to_dts(val, &dts) + iresult[i] = _pydatetime_to_dt64(val, &dts) if is_timestamp(val): iresult[i] += val.nanosecond try: @@ -2196,7 +2196,7 @@ cpdef array_to_datetime(ndarray[object] values, errors='raise', raise elif PyDate_Check(val): - iresult[i] = _date_to_datetime64(val, &dts) + iresult[i] = _pydate_to_dt64(val, &dts) try: check_dts_bounds(&dts) seen_datetime = 1 @@ -2353,7 +2353,7 @@ cpdef array_to_datetime(ndarray[object] values, errors='raise', try: oresult[i] = parse_datetime_string(val, dayfirst=dayfirst, yearfirst=yearfirst) - _pydatetime_to_dts(oresult[i], &dts) + _pydatetime_to_dt64(oresult[i], &dts) check_dts_bounds(&dts) except Exception: if is_raise: diff --git a/pandas/_libs/tslibs/np_datetime.pxd b/pandas/_libs/tslibs/np_datetime.pxd index d4079aae68900..235efd8d28549 100644 --- a/pandas/_libs/tslibs/np_datetime.pxd +++ b/pandas/_libs/tslibs/np_datetime.pxd @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # cython: profile=False +from cpython.datetime cimport date, datetime + from numpy cimport int64_t, int32_t @@ -14,3 +16,6 @@ cdef check_dts_bounds(pandas_datetimestruct *dts) cdef int64_t dtstruct_to_dt64(pandas_datetimestruct* dts) nogil cdef void dt64_to_dtstruct(int64_t dt64, pandas_datetimestruct* out) nogil + +cdef int64_t _pydatetime_to_dt64(datetime val, pandas_datetimestruct *dts) +cdef int64_t _pydate_to_dt64(date val, pandas_datetimestruct *dts) diff --git a/pandas/_libs/tslibs/np_datetime.pyx b/pandas/_libs/tslibs/np_datetime.pyx index 38158c816812d..00b3daacbd078 100644 --- a/pandas/_libs/tslibs/np_datetime.pyx +++ b/pandas/_libs/tslibs/np_datetime.pyx @@ -1,6 +1,15 @@ # -*- coding: utf-8 -*- # cython: profile=False +from cpython.datetime cimport (datetime, date, + PyDateTime_IMPORT, + PyDateTime_GET_YEAR, PyDateTime_GET_MONTH, + PyDateTime_GET_DAY, PyDateTime_DATE_GET_HOUR, + PyDateTime_DATE_GET_MINUTE, + PyDateTime_DATE_GET_SECOND, + PyDateTime_DATE_GET_MICROSECOND) +PyDateTime_IMPORT + from numpy cimport int64_t cdef extern from "numpy/ndarrayobject.h": @@ -80,3 +89,26 @@ cdef inline void dt64_to_dtstruct(int64_t dt64, with the by-far-most-common frequency PANDAS_FR_ns""" pandas_datetime_to_datetimestruct(dt64, PANDAS_FR_ns, out) return + + +cdef inline int64_t _pydatetime_to_dt64(datetime val, + pandas_datetimestruct *dts): + dts.year = PyDateTime_GET_YEAR(val) + dts.month = PyDateTime_GET_MONTH(val) + dts.day = PyDateTime_GET_DAY(val) + dts.hour = PyDateTime_DATE_GET_HOUR(val) + dts.min = PyDateTime_DATE_GET_MINUTE(val) + dts.sec = PyDateTime_DATE_GET_SECOND(val) + dts.us = PyDateTime_DATE_GET_MICROSECOND(val) + dts.ps = dts.as = 0 + return dtstruct_to_dt64(dts) + + +cdef inline int64_t _pydate_to_dt64(date val, + pandas_datetimestruct *dts): + dts.year = PyDateTime_GET_YEAR(val) + dts.month = PyDateTime_GET_MONTH(val) + dts.day = PyDateTime_GET_DAY(val) + dts.hour = dts.min = dts.sec = dts.us = 0 + dts.ps = dts.as = 0 + return dtstruct_to_dt64(dts) From 075574d7c51f6ca036a818c2a3299fd51591ce84 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Mon, 30 Oct 2017 21:48:45 -0700 Subject: [PATCH 2/3] update imports --- pandas/_libs/tslib.pyx | 5 ++--- pandas/_libs/tslibs/offsets.pyx | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index 3617836fc5039..90dc254b1d4c0 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -41,8 +41,6 @@ from datetime cimport ( get_datetime64_unit, PANDAS_DATETIMEUNIT, _string_to_dts, - _pydatetime_to_dt64, - _pydate_to_dt64, npy_datetime, is_leapyear, dayofweek, @@ -57,7 +55,8 @@ from datetime import time as datetime_time from tslibs.np_datetime cimport (check_dts_bounds, pandas_datetimestruct, - dt64_to_dtstruct, dtstruct_to_dt64) + dt64_to_dtstruct, dtstruct_to_dt64, + _pydatetime_to_dt64, _pydate_to_dt64) from tslibs.np_datetime import OutOfBoundsDatetime from khash cimport ( diff --git a/pandas/_libs/tslibs/offsets.pyx b/pandas/_libs/tslibs/offsets.pyx index 9959b053707c7..884160216591b 100644 --- a/pandas/_libs/tslibs/offsets.pyx +++ b/pandas/_libs/tslibs/offsets.pyx @@ -13,8 +13,8 @@ np.import_array() from util cimport is_string_object - -from pandas._libs.tslib import pydt_to_i8, tz_convert_single +from conversion cimport tz_convert_single +from pandas._libs.tslib import pydt_to_i8 # --------------------------------------------------------------------- # Constants From ccf793e0ec509ab6ea7e471cd8784a2c3015ce31 Mon Sep 17 00:00:00 2001 From: Brock Mendel Date: Tue, 31 Oct 2017 09:25:31 -0700 Subject: [PATCH 3/3] de-privatize --- pandas/_libs/tslib.pyx | 20 ++++++++++---------- pandas/_libs/tslibs/np_datetime.pxd | 4 ++-- pandas/_libs/tslibs/np_datetime.pyx | 8 ++++---- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index 90dc254b1d4c0..e42f6bf9a287e 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -56,7 +56,7 @@ from datetime import time as datetime_time from tslibs.np_datetime cimport (check_dts_bounds, pandas_datetimestruct, dt64_to_dtstruct, dtstruct_to_dt64, - _pydatetime_to_dt64, _pydate_to_dt64) + pydatetime_to_dt64, pydate_to_dt64) from tslibs.np_datetime import OutOfBoundsDatetime from khash cimport ( @@ -1679,7 +1679,7 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz, if (hasattr(tz, 'normalize') and hasattr(ts.tzinfo, '_utcoffset')): ts = tz.normalize(ts) - obj.value = _pydatetime_to_dt64(ts, &obj.dts) + obj.value = pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = ts.tzinfo else: # tzoffset @@ -1687,7 +1687,7 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz, tz = ts.astimezone(tz).tzinfo except: pass - obj.value = _pydatetime_to_dt64(ts, &obj.dts) + obj.value = pydatetime_to_dt64(ts, &obj.dts) ts_offset = get_utcoffset(ts.tzinfo, ts) obj.value -= int(ts_offset.total_seconds() * 1e9) tz_offset = get_utcoffset(tz, ts) @@ -1697,14 +1697,14 @@ cdef _TSObject convert_datetime_to_tsobject(datetime ts, object tz, obj.tzinfo = tz elif not is_utc(tz): ts = _localize_pydatetime(ts, tz) - obj.value = _pydatetime_to_dt64(ts, &obj.dts) + obj.value = pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = ts.tzinfo else: # UTC - obj.value = _pydatetime_to_dt64(ts, &obj.dts) + obj.value = pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = pytz.utc else: - obj.value = _pydatetime_to_dt64(ts, &obj.dts) + obj.value = pydatetime_to_dt64(ts, &obj.dts) obj.tzinfo = ts.tzinfo if obj.tzinfo is not None and not is_utc(obj.tzinfo): @@ -1858,7 +1858,7 @@ def datetime_to_datetime64(ndarray[object] values): if inferred_tz is not None: raise ValueError('Cannot mix tz-aware with ' 'tz-naive values') - iresult[i] = _pydatetime_to_dt64(val, &dts) + iresult[i] = pydatetime_to_dt64(val, &dts) check_dts_bounds(&dts) else: raise TypeError('Unrecognized value type: %s' % type(val)) @@ -2183,7 +2183,7 @@ cpdef array_to_datetime(ndarray[object] values, errors='raise', 'be converted to datetime64 unless ' 'utc=True') else: - iresult[i] = _pydatetime_to_dt64(val, &dts) + iresult[i] = pydatetime_to_dt64(val, &dts) if is_timestamp(val): iresult[i] += val.nanosecond try: @@ -2195,7 +2195,7 @@ cpdef array_to_datetime(ndarray[object] values, errors='raise', raise elif PyDate_Check(val): - iresult[i] = _pydate_to_dt64(val, &dts) + iresult[i] = pydate_to_dt64(val, &dts) try: check_dts_bounds(&dts) seen_datetime = 1 @@ -2352,7 +2352,7 @@ cpdef array_to_datetime(ndarray[object] values, errors='raise', try: oresult[i] = parse_datetime_string(val, dayfirst=dayfirst, yearfirst=yearfirst) - _pydatetime_to_dt64(oresult[i], &dts) + pydatetime_to_dt64(oresult[i], &dts) check_dts_bounds(&dts) except Exception: if is_raise: diff --git a/pandas/_libs/tslibs/np_datetime.pxd b/pandas/_libs/tslibs/np_datetime.pxd index 235efd8d28549..0e6eda0c88beb 100644 --- a/pandas/_libs/tslibs/np_datetime.pxd +++ b/pandas/_libs/tslibs/np_datetime.pxd @@ -17,5 +17,5 @@ cdef check_dts_bounds(pandas_datetimestruct *dts) cdef int64_t dtstruct_to_dt64(pandas_datetimestruct* dts) nogil cdef void dt64_to_dtstruct(int64_t dt64, pandas_datetimestruct* out) nogil -cdef int64_t _pydatetime_to_dt64(datetime val, pandas_datetimestruct *dts) -cdef int64_t _pydate_to_dt64(date val, pandas_datetimestruct *dts) +cdef int64_t pydatetime_to_dt64(datetime val, pandas_datetimestruct *dts) +cdef int64_t pydate_to_dt64(date val, pandas_datetimestruct *dts) diff --git a/pandas/_libs/tslibs/np_datetime.pyx b/pandas/_libs/tslibs/np_datetime.pyx index 00b3daacbd078..217cde2aad677 100644 --- a/pandas/_libs/tslibs/np_datetime.pyx +++ b/pandas/_libs/tslibs/np_datetime.pyx @@ -91,8 +91,8 @@ cdef inline void dt64_to_dtstruct(int64_t dt64, return -cdef inline int64_t _pydatetime_to_dt64(datetime val, - pandas_datetimestruct *dts): +cdef inline int64_t pydatetime_to_dt64(datetime val, + pandas_datetimestruct *dts): dts.year = PyDateTime_GET_YEAR(val) dts.month = PyDateTime_GET_MONTH(val) dts.day = PyDateTime_GET_DAY(val) @@ -104,8 +104,8 @@ cdef inline int64_t _pydatetime_to_dt64(datetime val, return dtstruct_to_dt64(dts) -cdef inline int64_t _pydate_to_dt64(date val, - pandas_datetimestruct *dts): +cdef inline int64_t pydate_to_dt64(date val, + pandas_datetimestruct *dts): dts.year = PyDateTime_GET_YEAR(val) dts.month = PyDateTime_GET_MONTH(val) dts.day = PyDateTime_GET_DAY(val)