Skip to content

Commit 085d0dc

Browse files
authored
REF: re-use existing conversion functions (#34625)
1 parent 03f5066 commit 085d0dc

File tree

1 file changed

+32
-35
lines changed

1 file changed

+32
-35
lines changed

pandas/_libs/tslibs/period.pyx

+32-35
Original file line numberDiff line numberDiff line change
@@ -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

832829
cdef void get_date_info(int64_t ordinal, int freq, npy_datetimestruct *dts) nogil:

0 commit comments

Comments
 (0)