From ab1b8f88959a4c432f189bffb54cd6632aa30f5a Mon Sep 17 00:00:00 2001 From: Brock Date: Sat, 6 Jun 2020 15:36:17 -0700 Subject: [PATCH 1/3] REF: re-use existing conversion functions --- pandas/_libs/tslibs/period.pyx | 84 +++++++++++++++++++--------------- 1 file changed, 47 insertions(+), 37 deletions(-) diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index e88a20bc549bd..e0d2bcf70a24c 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -763,10 +763,9 @@ cdef int64_t get_period_ordinal(npy_datetimestruct *dts, int freq) nogil: period_ordinal : int64_t """ cdef: - int64_t unix_date, seconds, delta - int64_t weeks - int64_t day_adj + int64_t unix_date int freq_group, fmonth, mdiff + NPY_DATETIMEUNIT unit freq_group = get_freq_group(freq) @@ -789,44 +788,55 @@ cdef int64_t get_period_ordinal(npy_datetimestruct *dts, int freq) nogil: mdiff = dts.month - fmonth + 12 return (dts.year - 1970) * 4 + (mdiff - 1) // 3 - elif freq == FR_MTH: - return (dts.year - 1970) * 12 + dts.month - 1 - - unix_date = npy_datetimestruct_to_datetime(NPY_FR_D, dts) - - if freq >= FR_SEC: - seconds = unix_date * 86400 + dts.hour * 3600 + dts.min * 60 + dts.sec - - if freq == FR_MS: - return seconds * 1000 + dts.us // 1000 - - elif freq == FR_US: - return seconds * 1000000 + dts.us - - elif freq == FR_NS: - return (seconds * 1000000000 + - dts.us * 1000 + dts.ps // 1000) - - else: - return seconds - - elif freq == FR_MIN: - return unix_date * 1440 + dts.hour * 60 + dts.min - - elif freq == FR_HR: - return unix_date * 24 + dts.hour - - elif freq == FR_DAY: - return unix_date - - elif freq == FR_UND: - return unix_date + elif freq_group == FR_WK: + unix_date = npy_datetimestruct_to_datetime(NPY_FR_D, dts) + return unix_date_to_week(unix_date, freq - FR_WK) elif freq == FR_BUS: + unix_date = npy_datetimestruct_to_datetime(NPY_FR_D, dts) return DtoB(dts, 0, unix_date) - elif freq_group == FR_WK: - return unix_date_to_week(unix_date, freq - FR_WK) + unit = get_unit(freq) + return npy_datetimestruct_to_datetime(unit, dts) + + +cdef NPY_DATETIMEUNIT get_unit(int freq) nogil: + """ + Convert the freq to the corresponding NPY_DATETIMEUNIT to pass + to npy_datetimestruct_to_datetime. + """ + # nogil-friendly equivalent to: + # unit = { + # FR_MTH: NPY_DATETIMEUNIT.NPY_FR_M, + # FR_DAY: NPY_DATETIMEUNIT.NPY_FR_D, + # FR_HR: NPY_DATETIMEUNIT.NPY_FR_h, + # FR_MIN: NPY_DATETIMEUNIT.NPY_FR_m, + # FR_SEC: NPY_DATETIMEUNIT.NPY_FR_s, + # FR_MS: NPY_DATETIMEUNIT.NPY_FR_ms, + # FR_US: NPY_DATETIMEUNIT.NPY_FR_us, + # FR_NS: NPY_DATETIMEUNIT.NPY_FR_ns, + # FR_UND: NPY_DATETIMEUNIT.NPY_FR_D, # Default to Day + # }[freq] + # return unit + if freq == FR_MTH: + return NPY_DATETIMEUNIT.NPY_FR_M + if freq == FR_DAY: + return NPY_DATETIMEUNIT.NPY_FR_D + if freq == FR_HR: + return NPY_DATETIMEUNIT.NPY_FR_h + if freq == FR_MIN: + return NPY_DATETIMEUNIT.NPY_FR_m + if freq == FR_SEC: + return NPY_DATETIMEUNIT.NPY_FR_s + if freq == FR_MS: + return NPY_DATETIMEUNIT.NPY_FR_ms + if freq == FR_US: + return NPY_DATETIMEUNIT.NPY_FR_us + if freq == FR_NS: + return NPY_DATETIMEUNIT.NPY_FR_ns + if freq == FR_UND: + # Default to Day + return NPY_DATETIMEUNIT.NPY_FR_D cdef void get_date_info(int64_t ordinal, int freq, npy_datetimestruct *dts) nogil: From 4de514d39dc5ffe6a4e322337b6e25a4f22f6440 Mon Sep 17 00:00:00 2001 From: Brock Date: Sat, 6 Jun 2020 15:37:58 -0700 Subject: [PATCH 2/3] remove commented-out --- pandas/_libs/tslibs/period.pyx | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index e0d2bcf70a24c..9d3ea909ad269 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -805,19 +805,6 @@ cdef NPY_DATETIMEUNIT get_unit(int freq) nogil: Convert the freq to the corresponding NPY_DATETIMEUNIT to pass to npy_datetimestruct_to_datetime. """ - # nogil-friendly equivalent to: - # unit = { - # FR_MTH: NPY_DATETIMEUNIT.NPY_FR_M, - # FR_DAY: NPY_DATETIMEUNIT.NPY_FR_D, - # FR_HR: NPY_DATETIMEUNIT.NPY_FR_h, - # FR_MIN: NPY_DATETIMEUNIT.NPY_FR_m, - # FR_SEC: NPY_DATETIMEUNIT.NPY_FR_s, - # FR_MS: NPY_DATETIMEUNIT.NPY_FR_ms, - # FR_US: NPY_DATETIMEUNIT.NPY_FR_us, - # FR_NS: NPY_DATETIMEUNIT.NPY_FR_ns, - # FR_UND: NPY_DATETIMEUNIT.NPY_FR_D, # Default to Day - # }[freq] - # return unit if freq == FR_MTH: return NPY_DATETIMEUNIT.NPY_FR_M if freq == FR_DAY: From c49213bb4c9edc4761a67657db4a93d9a8691371 Mon Sep 17 00:00:00 2001 From: Brock Date: Mon, 8 Jun 2020 07:39:33 -0700 Subject: [PATCH 3/3] if -> elif --- pandas/_libs/tslibs/period.pyx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pandas/_libs/tslibs/period.pyx b/pandas/_libs/tslibs/period.pyx index 3c62ae5485e6c..32acbcfb39b50 100644 --- a/pandas/_libs/tslibs/period.pyx +++ b/pandas/_libs/tslibs/period.pyx @@ -807,21 +807,21 @@ cdef NPY_DATETIMEUNIT get_unit(int freq) nogil: """ if freq == FR_MTH: return NPY_DATETIMEUNIT.NPY_FR_M - if freq == FR_DAY: + elif freq == FR_DAY: return NPY_DATETIMEUNIT.NPY_FR_D - if freq == FR_HR: + elif freq == FR_HR: return NPY_DATETIMEUNIT.NPY_FR_h - if freq == FR_MIN: + elif freq == FR_MIN: return NPY_DATETIMEUNIT.NPY_FR_m - if freq == FR_SEC: + elif freq == FR_SEC: return NPY_DATETIMEUNIT.NPY_FR_s - if freq == FR_MS: + elif freq == FR_MS: return NPY_DATETIMEUNIT.NPY_FR_ms - if freq == FR_US: + elif freq == FR_US: return NPY_DATETIMEUNIT.NPY_FR_us - if freq == FR_NS: + elif freq == FR_NS: return NPY_DATETIMEUNIT.NPY_FR_ns - if freq == FR_UND: + elif freq == FR_UND: # Default to Day return NPY_DATETIMEUNIT.NPY_FR_D