Skip to content

Commit 820a065

Browse files
authored
implement abbrev_to_npy_unit (#47395)
1 parent afaf268 commit 820a065

File tree

3 files changed

+49
-11
lines changed

3 files changed

+49
-11
lines changed

pandas/_libs/tslibs/conversion.pyx

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ from cpython.datetime cimport (
3131
import_datetime()
3232

3333
from pandas._libs.tslibs.base cimport ABCTimestamp
34-
from pandas._libs.tslibs.dtypes cimport periods_per_second
34+
from pandas._libs.tslibs.dtypes cimport (
35+
abbrev_to_npy_unit,
36+
periods_per_second,
37+
)
3538
from pandas._libs.tslibs.np_datetime cimport (
3639
NPY_DATETIMEUNIT,
3740
NPY_FR_ns,
@@ -139,35 +142,36 @@ cpdef inline (int64_t, int) precision_from_unit(str unit):
139142
cdef:
140143
int64_t m
141144
int p
145+
NPY_DATETIMEUNIT reso = abbrev_to_npy_unit(unit)
142146

143-
if unit == "Y":
147+
if reso == NPY_DATETIMEUNIT.NPY_FR_Y:
144148
m = 1_000_000_000 * 31556952
145149
p = 9
146-
elif unit == "M":
150+
elif reso == NPY_DATETIMEUNIT.NPY_FR_M:
147151
m = 1_000_000_000 * 2629746
148152
p = 9
149-
elif unit == "W":
153+
elif reso == NPY_DATETIMEUNIT.NPY_FR_W:
150154
m = 1_000_000_000 * 3600 * 24 * 7
151155
p = 9
152-
elif unit == "D" or unit == "d":
156+
elif reso == NPY_DATETIMEUNIT.NPY_FR_D:
153157
m = 1_000_000_000 * 3600 * 24
154158
p = 9
155-
elif unit == "h":
159+
elif reso == NPY_DATETIMEUNIT.NPY_FR_h:
156160
m = 1_000_000_000 * 3600
157161
p = 9
158-
elif unit == "m":
162+
elif reso == NPY_DATETIMEUNIT.NPY_FR_m:
159163
m = 1_000_000_000 * 60
160164
p = 9
161-
elif unit == "s":
165+
elif reso == NPY_DATETIMEUNIT.NPY_FR_s:
162166
m = 1_000_000_000
163167
p = 9
164-
elif unit == "ms":
168+
elif reso == NPY_DATETIMEUNIT.NPY_FR_ms:
165169
m = 1_000_000
166170
p = 6
167-
elif unit == "us":
171+
elif reso == NPY_DATETIMEUNIT.NPY_FR_us:
168172
m = 1000
169173
p = 3
170-
elif unit == "ns" or unit is None:
174+
elif reso == NPY_DATETIMEUNIT.NPY_FR_ns or reso == NPY_DATETIMEUNIT.NPY_FR_GENERIC:
171175
m = 1
172176
p = 0
173177
else:

pandas/_libs/tslibs/dtypes.pxd

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ from pandas._libs.tslibs.np_datetime cimport NPY_DATETIMEUNIT
44

55

66
cdef str npy_unit_to_abbrev(NPY_DATETIMEUNIT unit)
7+
cdef NPY_DATETIMEUNIT abbrev_to_npy_unit(str abbrev)
78
cdef NPY_DATETIMEUNIT freq_group_code_to_npy_unit(int freq) nogil
89
cpdef int64_t periods_per_day(NPY_DATETIMEUNIT reso=*) except? -1
910
cdef int64_t periods_per_second(NPY_DATETIMEUNIT reso) except? -1

pandas/_libs/tslibs/dtypes.pyx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,6 +313,39 @@ cdef str npy_unit_to_abbrev(NPY_DATETIMEUNIT unit):
313313
raise NotImplementedError(unit)
314314

315315

316+
cdef NPY_DATETIMEUNIT abbrev_to_npy_unit(str abbrev):
317+
if abbrev == "Y":
318+
return NPY_DATETIMEUNIT.NPY_FR_Y
319+
elif abbrev == "M":
320+
return NPY_DATETIMEUNIT.NPY_FR_M
321+
elif abbrev == "W":
322+
return NPY_DATETIMEUNIT.NPY_FR_W
323+
elif abbrev == "D" or abbrev == "d":
324+
return NPY_DATETIMEUNIT.NPY_FR_D
325+
elif abbrev == "h":
326+
return NPY_DATETIMEUNIT.NPY_FR_h
327+
elif abbrev == "m":
328+
return NPY_DATETIMEUNIT.NPY_FR_m
329+
elif abbrev == "s":
330+
return NPY_DATETIMEUNIT.NPY_FR_s
331+
elif abbrev == "ms":
332+
return NPY_DATETIMEUNIT.NPY_FR_ms
333+
elif abbrev == "us":
334+
return NPY_DATETIMEUNIT.NPY_FR_us
335+
elif abbrev == "ns":
336+
return NPY_DATETIMEUNIT.NPY_FR_ns
337+
elif abbrev == "ps":
338+
return NPY_DATETIMEUNIT.NPY_FR_ps
339+
elif abbrev == "fs":
340+
return NPY_DATETIMEUNIT.NPY_FR_fs
341+
elif abbrev == "as":
342+
return NPY_DATETIMEUNIT.NPY_FR_as
343+
elif abbrev is None:
344+
return NPY_DATETIMEUNIT.NPY_FR_GENERIC
345+
else:
346+
raise ValueError(f"Unrecognized unit {abbrev}")
347+
348+
316349
cdef NPY_DATETIMEUNIT freq_group_code_to_npy_unit(int freq) nogil:
317350
"""
318351
Convert the freq to the corresponding NPY_DATETIMEUNIT to pass

0 commit comments

Comments
 (0)