@@ -763,10 +763,9 @@ cdef int64_t get_period_ordinal(npy_datetimestruct *dts, int freq) nogil:
763
763
period_ordinal : int64_t
764
764
"""
765
765
cdef:
766
- int64_t unix_date, seconds, delta
767
- int64_t weeks
768
- int64_t day_adj
766
+ int64_t unix_date
769
767
int freq_group, fmonth, mdiff
768
+ NPY_DATETIMEUNIT unit
770
769
771
770
freq_group = get_freq_group(freq)
772
771
@@ -789,44 +788,42 @@ cdef int64_t get_period_ordinal(npy_datetimestruct *dts, int freq) nogil:
789
788
mdiff = dts.month - fmonth + 12
790
789
return (dts.year - 1970 ) * 4 + (mdiff - 1 ) // 3
791
790
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)
809
794
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)
812
798
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)
815
801
816
- elif freq == FR_HR:
817
- return unix_date * 24 + dts.hour
818
802
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
819
810
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
822
824
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
830
827
831
828
832
829
cdef void get_date_info(int64_t ordinal, int freq, npy_datetimestruct * dts) nogil:
0 commit comments