Skip to content

Commit c0e2ff0

Browse files
authored
REF: simplify get_yq (#34649)
1 parent d3f686b commit c0e2ff0

File tree

1 file changed

+24
-27
lines changed

1 file changed

+24
-27
lines changed

pandas/_libs/tslibs/period.pyx

Lines changed: 24 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -497,32 +497,31 @@ cdef int64_t asfreq_DTtoA(int64_t ordinal, asfreq_info *af_info) nogil:
497497
return <int64_t>(dts.year - 1970)
498498

499499

500-
cdef int DtoQ_yq(int64_t ordinal, asfreq_info *af_info, int *year) nogil:
500+
cdef int DtoQ_yq(int64_t ordinal, asfreq_info *af_info, npy_datetimestruct* dts) nogil:
501501
cdef:
502-
npy_datetimestruct dts
503502
int quarter
504503

505-
pandas_datetime_to_datetimestruct(ordinal, NPY_FR_D, &dts)
504+
pandas_datetime_to_datetimestruct(ordinal, NPY_FR_D, dts)
506505
if af_info.to_end != 12:
507506
dts.month -= af_info.to_end
508507
if dts.month <= 0:
509508
dts.month += 12
510509
else:
511510
dts.year += 1
512511

513-
year[0] = dts.year
514512
quarter = month_to_quarter(dts.month)
515513
return quarter
516514

517515

518516
cdef int64_t asfreq_DTtoQ(int64_t ordinal, asfreq_info *af_info) nogil:
519517
cdef:
520-
int year, quarter
518+
int quarter
519+
npy_datetimestruct dts
521520

522521
ordinal = downsample_daytime(ordinal, af_info)
523522

524-
quarter = DtoQ_yq(ordinal, af_info, &year)
525-
return <int64_t>((year - 1970) * 4 + quarter - 1)
523+
quarter = DtoQ_yq(ordinal, af_info, &dts)
524+
return <int64_t>((dts.year - 1970) * 4 + quarter - 1)
526525

527526

528527
cdef int64_t asfreq_DTtoM(int64_t ordinal, asfreq_info *af_info) nogil:
@@ -919,30 +918,30 @@ cdef int64_t get_time_nanos(int freq, int64_t unix_date, int64_t ordinal) nogil:
919918
return sub * factor
920919

921920

922-
cdef int get_yq(int64_t ordinal, int freq, int *quarter, int *year):
921+
cdef int get_yq(int64_t ordinal, int freq, npy_datetimestruct* dts):
923922
"""
924923
Find the year and quarter of a Period with the given ordinal and frequency
925924
926925
Parameters
927926
----------
928927
ordinal : int64_t
929928
freq : int
930-
quarter : *int
931-
year : *int
929+
dts : *npy_datetimestruct
932930
933931
Returns
934932
-------
935-
qtr_freq : int
933+
quarter : int
936934
describes the implied quarterly frequency associated with `freq`
937935
938936
Notes
939937
-----
940-
Sets quarter and year inplace
938+
Sets dts.year in-place.
941939
"""
942940
cdef:
943941
asfreq_info af_info
944942
int qtr_freq
945943
int64_t unix_date
944+
int quarter
946945

947946
unix_date = get_unix_date(ordinal, freq)
948947

@@ -951,11 +950,10 @@ cdef int get_yq(int64_t ordinal, int freq, int *quarter, int *year):
951950
else:
952951
qtr_freq = FR_QTR
953952

954-
assert (qtr_freq % 1000) <= 12
955953
get_asfreq_info(FR_DAY, qtr_freq, True, &af_info)
956954

957-
quarter[0] = DtoQ_yq(unix_date, &af_info, year)
958-
return qtr_freq
955+
quarter = DtoQ_yq(unix_date, &af_info, dts)
956+
return quarter
959957

960958

961959
cdef inline int month_to_quarter(int month) nogil:
@@ -1225,15 +1223,15 @@ cdef str _period_strftime(int64_t value, int freq, bytes fmt):
12251223

12261224
for i in range(len(extra_fmts)):
12271225
if found_pat[i]:
1228-
if get_yq(value, freq, &quarter, &year) < 0:
1229-
raise ValueError('Unable to get quarter and year')
1226+
1227+
quarter = get_yq(value, freq, &dts)
12301228

12311229
if i == 0:
12321230
repl = str(quarter)
12331231
elif i == 1: # %f, 2-digit year
1234-
repl = f"{(year % 100):02d}"
1232+
repl = f"{(dts.year % 100):02d}"
12351233
elif i == 2:
1236-
repl = str(year)
1234+
repl = str(dts.year)
12371235
elif i == 3:
12381236
repl = f"{(value % 1_000):03d}"
12391237
elif i == 4:
@@ -1259,20 +1257,19 @@ cdef int pyear(int64_t ordinal, int freq):
12591257
return dts.year
12601258

12611259

1262-
@cython.cdivision
12631260
cdef int pqyear(int64_t ordinal, int freq):
12641261
cdef:
1265-
int year = 0
1266-
int quarter = 0
1267-
get_yq(ordinal, freq, &quarter, &year)
1268-
return year
1262+
npy_datetimestruct dts
1263+
1264+
get_yq(ordinal, freq, &dts)
1265+
return dts.year
12691266

12701267

12711268
cdef int pquarter(int64_t ordinal, int freq):
12721269
cdef:
1273-
int year = 0
1274-
int quarter = 0
1275-
get_yq(ordinal, freq, &quarter, &year)
1270+
int quarter
1271+
npy_datetimestruct dts
1272+
quarter = get_yq(ordinal, freq, &dts)
12761273
return quarter
12771274

12781275

0 commit comments

Comments
 (0)