diff --git a/pandas/_libs/period.pyx b/pandas/_libs/period.pyx index cf6ef91d3e608..76664e276c634 100644 --- a/pandas/_libs/period.pyx +++ b/pandas/_libs/period.pyx @@ -17,12 +17,9 @@ from pandas.compat import PY2 cimport cython -from datetime cimport ( - is_leapyear, - pandas_datetimestruct, - pandas_datetimestruct_to_datetime, - pandas_datetime_to_datetimestruct, - PANDAS_FR_ns) +from tslibs.np_datetime cimport (pandas_datetimestruct, + dtstruct_to_dt64, dt64_to_dtstruct) +from datetime cimport is_leapyear cimport util @@ -137,7 +134,7 @@ def dt64arr_to_periodarr(ndarray[int64_t] dtarr, int freq, tz=None): if dtarr[i] == NPY_NAT: out[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(dtarr[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtarr[i], &dts) out[i] = get_period_ordinal(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.us, dts.ps, freq) @@ -268,7 +265,7 @@ cpdef int64_t period_ordinal_to_dt64(int64_t ordinal, int freq) nogil: dts.us = int((subsecond_fraction) * 1e6) dts.ps = int(((subsecond_fraction) * 1e6 - dts.us) * 1e6) - return pandas_datetimestruct_to_datetime(PANDAS_FR_ns, &dts) + return dtstruct_to_dt64(&dts) def period_format(int64_t value, int freq, object fmt=None): @@ -499,7 +496,7 @@ cpdef resolution(ndarray[int64_t] stamps, tz=None): for i in range(n): if stamps[i] == NPY_NAT: continue - pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i], &dts) curr_reso = _reso_stamp(&dts) if curr_reso < reso: reso = curr_reso @@ -530,7 +527,7 @@ cdef _reso_local(ndarray[int64_t] stamps, object tz): for i in range(n): if stamps[i] == NPY_NAT: continue - pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i], &dts) curr_reso = _reso_stamp(&dts) if curr_reso < reso: reso = curr_reso @@ -538,13 +535,11 @@ cdef _reso_local(ndarray[int64_t] stamps, object tz): for i in range(n): if stamps[i] == NPY_NAT: continue - pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_ns, - &dts) + dt64_to_dtstruct(stamps[i], &dts) dt = datetime(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.us, tz) delta = int(get_utcoffset(tz, dt).total_seconds()) * 1000000000 - pandas_datetime_to_datetimestruct(stamps[i] + delta, - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i] + delta, &dts) curr_reso = _reso_stamp(&dts) if curr_reso < reso: reso = curr_reso @@ -562,8 +557,7 @@ cdef _reso_local(ndarray[int64_t] stamps, object tz): for i in range(n): if stamps[i] == NPY_NAT: continue - pandas_datetime_to_datetimestruct(stamps[i] + deltas[0], - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i] + deltas[0], &dts) curr_reso = _reso_stamp(&dts) if curr_reso < reso: reso = curr_reso @@ -571,8 +565,7 @@ cdef _reso_local(ndarray[int64_t] stamps, object tz): for i in range(n): if stamps[i] == NPY_NAT: continue - pandas_datetime_to_datetimestruct(stamps[i] + deltas[pos[i]], - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i] + deltas[pos[i]], &dts) curr_reso = _reso_stamp(&dts) if curr_reso < reso: reso = curr_reso @@ -595,7 +588,7 @@ cdef ndarray[int64_t] localize_dt64arr_to_period(ndarray[int64_t] stamps, if stamps[i] == NPY_NAT: result[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i], &dts) result[i] = get_period_ordinal(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.us, dts.ps, freq) @@ -605,13 +598,11 @@ cdef ndarray[int64_t] localize_dt64arr_to_period(ndarray[int64_t] stamps, if stamps[i] == NPY_NAT: result[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(stamps[i], PANDAS_FR_ns, - &dts) + dt64_to_dtstruct(stamps[i], &dts) dt = datetime(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.us, tz) delta = int(get_utcoffset(tz, dt).total_seconds()) * 1000000000 - pandas_datetime_to_datetimestruct(stamps[i] + delta, - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i] + delta, &dts) result[i] = get_period_ordinal(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.us, dts.ps, freq) @@ -630,8 +621,7 @@ cdef ndarray[int64_t] localize_dt64arr_to_period(ndarray[int64_t] stamps, if stamps[i] == NPY_NAT: result[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(stamps[i] + deltas[0], - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i] + deltas[0], &dts) result[i] = get_period_ordinal(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.us, dts.ps, freq) @@ -640,8 +630,7 @@ cdef ndarray[int64_t] localize_dt64arr_to_period(ndarray[int64_t] stamps, if stamps[i] == NPY_NAT: result[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(stamps[i] + deltas[pos[i]], - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(stamps[i] + deltas[pos[i]], &dts) result[i] = get_period_ordinal(dts.year, dts.month, dts.day, dts.hour, dts.min, dts.sec, dts.us, dts.ps, freq) diff --git a/pandas/_libs/tslib.pyx b/pandas/_libs/tslib.pyx index 7a335b19eb87b..ede1cf7241168 100644 --- a/pandas/_libs/tslib.pyx +++ b/pandas/_libs/tslib.pyx @@ -33,7 +33,6 @@ cimport util from cpython.datetime cimport PyDelta_Check, PyTZInfo_Check # this is our datetime.pxd from datetime cimport ( - pandas_datetimestruct, pandas_datetime_to_datetimestruct, pandas_datetimestruct_to_datetime, days_per_month_table, @@ -50,14 +49,15 @@ from datetime cimport ( PANDAS_FR_ns, PyDateTime_Check, PyDate_Check, PyDateTime_IMPORT, - timedelta, datetime - ) + timedelta, datetime) # stdlib datetime imports from datetime import timedelta, datetime from datetime import time as datetime_time -from tslibs.np_datetime cimport check_dts_bounds +from tslibs.np_datetime cimport (check_dts_bounds, + pandas_datetimestruct, + dt64_to_dtstruct, dtstruct_to_dt64) from tslibs.np_datetime import OutOfBoundsDatetime from khash cimport ( @@ -149,8 +149,7 @@ def ints_to_pydatetime(ndarray[int64_t] arr, tz=None, freq=None, box=False): if value == NPY_NAT: result[i] = NaT else: - pandas_datetime_to_datetimestruct( - value, PANDAS_FR_ns, &dts) + dt64_to_dtstruct(value, &dts) result[i] = func_create(value, dts, tz, freq) elif is_tzlocal(tz) or is_fixed_offset(tz): for i in range(n): @@ -158,8 +157,7 @@ def ints_to_pydatetime(ndarray[int64_t] arr, tz=None, freq=None, box=False): if value == NPY_NAT: result[i] = NaT else: - pandas_datetime_to_datetimestruct( - value, PANDAS_FR_ns, &dts) + dt64_to_dtstruct(value, &dts) dt = create_datetime_from_ts(value, dts, tz, freq) dt = dt + tz.utcoffset(dt) if box: @@ -185,8 +183,7 @@ def ints_to_pydatetime(ndarray[int64_t] arr, tz=None, freq=None, box=False): # represented in single object. new_tz = tz - pandas_datetime_to_datetimestruct( - value + deltas[pos], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(value + deltas[pos], &dts) result[i] = func_create(value, dts, new_tz, freq) else: for i in range(n): @@ -195,7 +192,7 @@ def ints_to_pydatetime(ndarray[int64_t] arr, tz=None, freq=None, box=False): if value == NPY_NAT: result[i] = NaT else: - pandas_datetime_to_datetimestruct(value, PANDAS_FR_ns, &dts) + dt64_to_dtstruct(value, &dts) result[i] = func_create(value, dts, None, freq) return result @@ -698,7 +695,7 @@ class Timestamp(_Timestamp): value += value - value_tz # setup components - pandas_datetime_to_datetimestruct(value, PANDAS_FR_ns, &dts) + dt64_to_dtstruct(value, &dts) dts.ps = self.nanosecond * 1000 # replace @@ -1811,7 +1808,7 @@ def _test_parse_iso8601(object ts): obj = _TSObject() _string_to_dts(ts, &obj.dts, &out_local, &out_tzoffset) - obj.value = pandas_datetimestruct_to_datetime(PANDAS_FR_ns, &obj.dts) + obj.value = dtstruct_to_dt64(&obj.dts) check_dts_bounds(&obj.dts) if out_local == 1: obj.tzinfo = pytz.FixedOffset(out_tzoffset) @@ -1984,7 +1981,7 @@ def format_array_from_datetime(ndarray[int64_t] values, object tz=None, result[i] = na_rep elif basic_format: - pandas_datetime_to_datetimestruct(val, PANDAS_FR_ns, &dts) + dt64_to_dtstruct(val, &dts) res = '%d-%.2d-%.2d %.2d:%.2d:%.2d' % (dts.year, dts.month, dts.day, @@ -3792,7 +3789,7 @@ cdef inline int64_t _normalized_stamp(pandas_datetimestruct *dts) nogil: dts.sec = 0 dts.us = 0 dts.ps = 0 - return pandas_datetimestruct_to_datetime(PANDAS_FR_ns, dts) + return dtstruct_to_dt64(dts) def dates_normalized(ndarray[int64_t] stamps, tz=None): @@ -3910,13 +3907,12 @@ def shift_months(int64_t[:] dtindex, int months, object day=None): out[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(dtindex[i], - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dts.year = _year_add_months(dts, months) dts.month = _month_add_months(dts, months) dts.day = min(dts.day, days_in_month(dts)) - out[i] = pandas_datetimestruct_to_datetime(PANDAS_FR_ns, &dts) + out[i] = dtstruct_to_dt64(&dts) elif day == 'start': roll_check = False if months <= 0: @@ -3928,8 +3924,7 @@ def shift_months(int64_t[:] dtindex, int months, object day=None): out[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(dtindex[i], - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) months_to_roll = months # offset semantics - if on the anchor point and going backwards @@ -3941,7 +3936,7 @@ def shift_months(int64_t[:] dtindex, int months, object day=None): dts.month = _month_add_months(dts, months_to_roll) dts.day = 1 - out[i] = pandas_datetimestruct_to_datetime(PANDAS_FR_ns, &dts) + out[i] = dtstruct_to_dt64(&dts) elif day == 'end': roll_check = False if months > 0: @@ -3953,8 +3948,7 @@ def shift_months(int64_t[:] dtindex, int months, object day=None): out[i] = NPY_NAT continue - pandas_datetime_to_datetimestruct(dtindex[i], - PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) months_to_roll = months # similar semantics - when adding shift forward by one @@ -3966,7 +3960,7 @@ def shift_months(int64_t[:] dtindex, int months, object day=None): dts.month = _month_add_months(dts, months_to_roll) dts.day = days_in_month(dts) - out[i] = pandas_datetimestruct_to_datetime(PANDAS_FR_ns, &dts) + out[i] = dtstruct_to_dt64(&dts) else: raise ValueError("day must be None, 'start' or 'end'") diff --git a/pandas/_libs/tslibs/fields.pyx b/pandas/_libs/tslibs/fields.pyx index 1427bf50239ba..53ed8ddf22f4b 100644 --- a/pandas/_libs/tslibs/fields.pyx +++ b/pandas/_libs/tslibs/fields.pyx @@ -17,10 +17,9 @@ from numpy cimport ndarray, int64_t, int32_t, int8_t np.import_array() +from np_datetime cimport pandas_datetimestruct, dt64_to_dtstruct + from datetime cimport ( - pandas_datetimestruct, - pandas_datetime_to_datetimestruct, - PANDAS_FR_ns, days_per_month_table, is_leapyear, dayofweek) @@ -60,7 +59,7 @@ def build_field_sarray(ndarray[int64_t] dtindex): mus = out['u'] for i in range(count): - pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) years[i] = dts.year months[i] = dts.month days[i] = dts.day @@ -99,7 +98,7 @@ def get_date_name_field(ndarray[int64_t] dtindex, object field): out[i] = np.nan continue - pandas_datetime_to_datetimestruct(dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dow = dayofweek(dts.year, dts.month, dts.day) out[i] = _dayname[dow] return out @@ -164,8 +163,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dom = dts.day dow = dayofweek(dts.year, dts.month, dts.day) @@ -178,8 +176,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dom = dts.day if dom == 1: @@ -193,8 +190,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) mo_off = _month_offset[isleap, dts.month - 1] dom = dts.day @@ -212,8 +208,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) mo_off = _month_offset[isleap, dts.month - 1] dom = dts.day @@ -231,8 +226,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dom = dts.day dow = dayofweek(dts.year, dts.month, dts.day) @@ -246,8 +240,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dom = dts.day if ((dts.month - start_month) % 3 == 0) and dom == 1: @@ -261,8 +254,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) mo_off = _month_offset[isleap, dts.month - 1] dom = dts.day @@ -281,8 +273,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) mo_off = _month_offset[isleap, dts.month - 1] dom = dts.day @@ -300,8 +291,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dom = dts.day dow = dayofweek(dts.year, dts.month, dts.day) @@ -315,8 +305,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) dom = dts.day if (dts.month == start_month) and dom == 1: @@ -330,8 +319,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) dom = dts.day mo_off = _month_offset[isleap, dts.month - 1] @@ -350,8 +338,7 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field, out[i] = 0 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) mo_off = _month_offset[isleap, dts.month - 1] dom = dts.day @@ -395,8 +382,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.year return out @@ -407,8 +393,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.month return out @@ -419,8 +404,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.day return out @@ -431,8 +415,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.hour return out @@ -443,8 +426,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.min return out @@ -455,8 +437,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.sec return out @@ -467,8 +448,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.us return out @@ -479,8 +459,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.ps / 1000 return out elif field == 'doy': @@ -490,8 +469,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) out[i] = _month_offset[isleap, dts.month -1] + dts.day return out @@ -503,8 +481,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dayofweek(dts.year, dts.month, dts.day) return out @@ -515,8 +492,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) isleap = is_leapyear(dts.year) isleap_prev = is_leapyear(dts.year - 1) mo_off = _month_offset[isleap, dts.month - 1] @@ -548,8 +524,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = dts.month out[i] = ((out[i] - 1) / 3) + 1 return out @@ -561,8 +536,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field): out[i] = -1 continue - pandas_datetime_to_datetimestruct( - dtindex[i], PANDAS_FR_ns, &dts) + dt64_to_dtstruct(dtindex[i], &dts) out[i] = days_in_month(dts) return out elif field == 'is_leap_year': diff --git a/setup.py b/setup.py index 2843ab6587412..a46a7c4a8818c 100755 --- a/setup.py +++ b/setup.py @@ -492,7 +492,7 @@ def pxd(name): 'sources': np_datetime_sources}, '_libs.tslibs.offsets': {'pyxfile': '_libs/tslibs/offsets'}, '_libs.tslib': {'pyxfile': '_libs/tslib', - 'pxdfiles': ['_libs/src/util', '_libs/lib'], + 'pxdfiles': ['_libs/src/util'], 'depends': tseries_depends, 'sources': np_datetime_sources}, '_libs.tslibs.np_datetime': {'pyxfile': '_libs/tslibs/np_datetime', @@ -543,12 +543,9 @@ def pxd(name): 'sources': ['pandas/_libs/src/parser/tokenizer.c', 'pandas/_libs/src/parser/io.c']}, '_libs.sparse': {'pyxfile': '_libs/sparse', - 'depends': (['pandas/_libs/sparse.pyx'] + - _pxi_dep['sparse'])}, - '_libs.testing': {'pyxfile': '_libs/testing', - 'depends': ['pandas/_libs/testing.pyx']}, - '_libs.hashing': {'pyxfile': '_libs/hashing', - 'depends': ['pandas/_libs/hashing.pyx']}, + 'depends': _pxi_dep['sparse']}, + '_libs.testing': {'pyxfile': '_libs/testing'}, + '_libs.hashing': {'pyxfile': '_libs/hashing'}, 'io.sas._sas': {'pyxfile': 'io/sas/sas'}} extensions = []