@@ -763,10 +763,9 @@ cdef int64_t get_period_ordinal(npy_datetimestruct *dts, int freq) nogil:
763763 period_ordinal : int64_t
764764 """
765765 cdef:
766- int64_t unix_date, seconds, delta
767- int64_t weeks
768- int64_t day_adj
766+ int64_t unix_date
769767 int freq_group, fmonth, mdiff
768+ NPY_DATETIMEUNIT unit
770769
771770 freq_group = get_freq_group(freq)
772771
@@ -789,44 +788,42 @@ cdef int64_t get_period_ordinal(npy_datetimestruct *dts, int freq) nogil:
789788 mdiff = dts.month - fmonth + 12
790789 return (dts.year - 1970 ) * 4 + (mdiff - 1 ) // 3
791790
792- elif freq == FR_MTH:
793- return (dts.year - 1970 ) * 12 + dts.month - 1
794-
795- unix_date = npy_datetimestruct_to_datetime(NPY_FR_D, dts)
796-
797- if freq >= FR_SEC:
798- seconds = unix_date * 86400 + dts.hour * 3600 + dts.min * 60 + dts.sec
799-
800- if freq == FR_MS:
801- return seconds * 1000 + dts.us // 1000
802-
803- elif freq == FR_US:
804- return seconds * 1000000 + dts.us
805-
806- elif freq == FR_NS:
807- return (seconds * 1000000000 +
808- dts.us * 1000 + dts.ps // 1000 )
791+ elif freq_group == FR_WK:
792+ unix_date = npy_datetimestruct_to_datetime(NPY_FR_D, dts)
793+ return unix_date_to_week(unix_date, freq - FR_WK)
809794
810- else :
811- return seconds
795+ elif freq == FR_BUS:
796+ unix_date = npy_datetimestruct_to_datetime(NPY_FR_D, dts)
797+ return DtoB(dts, 0 , unix_date)
812798
813- elif freq == FR_MIN:
814- return unix_date * 1440 + dts.hour * 60 + dts.min
799+ unit = get_unit(freq)
800+ return npy_datetimestruct_to_datetime(unit, dts)
815801
816- elif freq == FR_HR:
817- return unix_date * 24 + dts.hour
818802
803+ cdef NPY_DATETIMEUNIT get_unit(int freq) nogil:
804+ """
805+ Convert the freq to the corresponding NPY_DATETIMEUNIT to pass
806+ to npy_datetimestruct_to_datetime.
807+ """
808+ if freq == FR_MTH:
809+ return NPY_DATETIMEUNIT.NPY_FR_M
819810 elif freq == FR_DAY:
820- return unix_date
821-
811+ return NPY_DATETIMEUNIT.NPY_FR_D
812+ elif freq == FR_HR:
813+ return NPY_DATETIMEUNIT.NPY_FR_h
814+ elif freq == FR_MIN:
815+ return NPY_DATETIMEUNIT.NPY_FR_m
816+ elif freq == FR_SEC:
817+ return NPY_DATETIMEUNIT.NPY_FR_s
818+ elif freq == FR_MS:
819+ return NPY_DATETIMEUNIT.NPY_FR_ms
820+ elif freq == FR_US:
821+ return NPY_DATETIMEUNIT.NPY_FR_us
822+ elif freq == FR_NS:
823+ return NPY_DATETIMEUNIT.NPY_FR_ns
822824 elif freq == FR_UND:
823- return unix_date
824-
825- elif freq == FR_BUS:
826- return DtoB(dts, 0 , unix_date)
827-
828- elif freq_group == FR_WK:
829- return unix_date_to_week(unix_date, freq - FR_WK)
825+ # Default to Day
826+ return NPY_DATETIMEUNIT.NPY_FR_D
830827
831828
832829cdef void get_date_info(int64_t ordinal, int freq, npy_datetimestruct * dts) nogil:
0 commit comments