Skip to content

implement abbrev_to_npy_unit #47395

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jun 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 15 additions & 11 deletions pandas/_libs/tslibs/conversion.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,10 @@ from cpython.datetime cimport (
import_datetime()

from pandas._libs.tslibs.base cimport ABCTimestamp
from pandas._libs.tslibs.dtypes cimport periods_per_second
from pandas._libs.tslibs.dtypes cimport (
abbrev_to_npy_unit,
periods_per_second,
)
from pandas._libs.tslibs.np_datetime cimport (
NPY_DATETIMEUNIT,
NPY_FR_ns,
Expand Down Expand Up @@ -139,35 +142,36 @@ cpdef inline (int64_t, int) precision_from_unit(str unit):
cdef:
int64_t m
int p
NPY_DATETIMEUNIT reso = abbrev_to_npy_unit(unit)

if unit == "Y":
if reso == NPY_DATETIMEUNIT.NPY_FR_Y:
m = 1_000_000_000 * 31556952
p = 9
elif unit == "M":
elif reso == NPY_DATETIMEUNIT.NPY_FR_M:
m = 1_000_000_000 * 2629746
p = 9
elif unit == "W":
elif reso == NPY_DATETIMEUNIT.NPY_FR_W:
m = 1_000_000_000 * 3600 * 24 * 7
p = 9
elif unit == "D" or unit == "d":
elif reso == NPY_DATETIMEUNIT.NPY_FR_D:
m = 1_000_000_000 * 3600 * 24
p = 9
elif unit == "h":
elif reso == NPY_DATETIMEUNIT.NPY_FR_h:
m = 1_000_000_000 * 3600
p = 9
elif unit == "m":
elif reso == NPY_DATETIMEUNIT.NPY_FR_m:
m = 1_000_000_000 * 60
p = 9
elif unit == "s":
elif reso == NPY_DATETIMEUNIT.NPY_FR_s:
m = 1_000_000_000
p = 9
elif unit == "ms":
elif reso == NPY_DATETIMEUNIT.NPY_FR_ms:
m = 1_000_000
p = 6
elif unit == "us":
elif reso == NPY_DATETIMEUNIT.NPY_FR_us:
m = 1000
p = 3
elif unit == "ns" or unit is None:
elif reso == NPY_DATETIMEUNIT.NPY_FR_ns or reso == NPY_DATETIMEUNIT.NPY_FR_GENERIC:
m = 1
p = 0
else:
Expand Down
1 change: 1 addition & 0 deletions pandas/_libs/tslibs/dtypes.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ from pandas._libs.tslibs.np_datetime cimport NPY_DATETIMEUNIT


cdef str npy_unit_to_abbrev(NPY_DATETIMEUNIT unit)
cdef NPY_DATETIMEUNIT abbrev_to_npy_unit(str abbrev)
cdef NPY_DATETIMEUNIT freq_group_code_to_npy_unit(int freq) nogil
cpdef int64_t periods_per_day(NPY_DATETIMEUNIT reso=*) except? -1
cdef int64_t periods_per_second(NPY_DATETIMEUNIT reso) except? -1
Expand Down
33 changes: 33 additions & 0 deletions pandas/_libs/tslibs/dtypes.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -313,6 +313,39 @@ cdef str npy_unit_to_abbrev(NPY_DATETIMEUNIT unit):
raise NotImplementedError(unit)


cdef NPY_DATETIMEUNIT abbrev_to_npy_unit(str abbrev):
if abbrev == "Y":
return NPY_DATETIMEUNIT.NPY_FR_Y
elif abbrev == "M":
return NPY_DATETIMEUNIT.NPY_FR_M
elif abbrev == "W":
return NPY_DATETIMEUNIT.NPY_FR_W
elif abbrev == "D" or abbrev == "d":
return NPY_DATETIMEUNIT.NPY_FR_D
elif abbrev == "h":
return NPY_DATETIMEUNIT.NPY_FR_h
elif abbrev == "m":
return NPY_DATETIMEUNIT.NPY_FR_m
elif abbrev == "s":
return NPY_DATETIMEUNIT.NPY_FR_s
elif abbrev == "ms":
return NPY_DATETIMEUNIT.NPY_FR_ms
elif abbrev == "us":
return NPY_DATETIMEUNIT.NPY_FR_us
elif abbrev == "ns":
return NPY_DATETIMEUNIT.NPY_FR_ns
elif abbrev == "ps":
return NPY_DATETIMEUNIT.NPY_FR_ps
elif abbrev == "fs":
return NPY_DATETIMEUNIT.NPY_FR_fs
elif abbrev == "as":
return NPY_DATETIMEUNIT.NPY_FR_as
elif abbrev is None:
return NPY_DATETIMEUNIT.NPY_FR_GENERIC
else:
raise ValueError(f"Unrecognized unit {abbrev}")


cdef NPY_DATETIMEUNIT freq_group_code_to_npy_unit(int freq) nogil:
"""
Convert the freq to the corresponding NPY_DATETIMEUNIT to pass
Expand Down