Skip to content

Commit 9b21c54

Browse files
jbrockmendeljreback
authored andcommitted
Remove unnecessary iNaT checks from _Period properties (#17421)
1 parent 94266d4 commit 9b21c54

File tree

2 files changed

+135
-51
lines changed

2 files changed

+135
-51
lines changed

asv_bench/benchmarks/period.py

+59
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,65 @@ def time_value_counts_pindex(self):
7878
self.i.value_counts()
7979

8080

81+
class Properties(object):
82+
def setup(self):
83+
self.per = Period('2017-09-06 08:28', freq='min')
84+
85+
def time_year(self):
86+
self.per.year
87+
88+
def time_month(self):
89+
self.per.month
90+
91+
def time_day(self):
92+
self.per.day
93+
94+
def time_hour(self):
95+
self.per.hour
96+
97+
def time_minute(self):
98+
self.per.minute
99+
100+
def time_second(self):
101+
self.per.second
102+
103+
def time_is_leap_year(self):
104+
self.per.is_leap_year
105+
106+
def time_quarter(self):
107+
self.per.quarter
108+
109+
def time_qyear(self):
110+
self.per.qyear
111+
112+
def time_week(self):
113+
self.per.week
114+
115+
def time_daysinmonth(self):
116+
self.per.daysinmonth
117+
118+
def time_dayofweek(self):
119+
self.per.dayofweek
120+
121+
def time_dayofyear(self):
122+
self.per.dayofyear
123+
124+
def time_start_time(self):
125+
self.per.start_time
126+
127+
def time_end_time(self):
128+
self.per.end_time
129+
130+
def time_to_timestamp():
131+
self.per.to_timestamp()
132+
133+
def time_now():
134+
self.per.now()
135+
136+
def time_asfreq():
137+
self.per.asfreq('A')
138+
139+
81140
class period_standard_indexing(object):
82141
goal_time = 0.2
83142

pandas/_libs/period.pyx

+76-51
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,8 @@ cdef extern from "period_helper.h":
107107
int pday(int64_t ordinal, int freq) except INT32_MIN
108108
int pweekday(int64_t ordinal, int freq) except INT32_MIN
109109
int pday_of_week(int64_t ordinal, int freq) except INT32_MIN
110+
# TODO: pday_of_week and pweekday are identical. Make one an alias instead
111+
# of importing them separately.
110112
int pday_of_year(int64_t ordinal, int freq) except INT32_MIN
111113
int pweek(int64_t ordinal, int freq) except INT32_MIN
112114
int phour(int64_t ordinal, int freq) except INT32_MIN
@@ -868,58 +870,81 @@ cdef class _Period(object):
868870
dt64 = period_ordinal_to_dt64(val.ordinal, base)
869871
return Timestamp(dt64, tz=tz)
870872

871-
cdef _field(self, alias):
873+
@property
874+
def year(self):
875+
base, mult = get_freq_code(self.freq)
876+
return pyear(self.ordinal, base)
877+
878+
@property
879+
def month(self):
880+
base, mult = get_freq_code(self.freq)
881+
return pmonth(self.ordinal, base)
882+
883+
@property
884+
def day(self):
885+
base, mult = get_freq_code(self.freq)
886+
return pday(self.ordinal, base)
887+
888+
@property
889+
def hour(self):
890+
base, mult = get_freq_code(self.freq)
891+
return phour(self.ordinal, base)
892+
893+
@property
894+
def minute(self):
895+
base, mult = get_freq_code(self.freq)
896+
return pminute(self.ordinal, base)
897+
898+
@property
899+
def second(self):
900+
base, mult = get_freq_code(self.freq)
901+
return psecond(self.ordinal, base)
902+
903+
@property
904+
def weekofyear(self):
905+
base, mult = get_freq_code(self.freq)
906+
return pweek(self.ordinal, base)
907+
908+
@property
909+
def week(self):
910+
return self.weekofyear
911+
912+
@property
913+
def dayofweek(self):
914+
base, mult = get_freq_code(self.freq)
915+
return pweekday(self.ordinal, base)
916+
917+
@property
918+
def weekday(self):
919+
return self.dayofweek
920+
921+
@property
922+
def dayofyear(self):
923+
base, mult = get_freq_code(self.freq)
924+
return pday_of_year(self.ordinal, base)
925+
926+
@property
927+
def quarter(self):
872928
base, mult = get_freq_code(self.freq)
873-
return get_period_field(alias, self.ordinal, base)
874-
875-
property year:
876-
def __get__(self):
877-
return self._field(0)
878-
property month:
879-
def __get__(self):
880-
return self._field(3)
881-
property day:
882-
def __get__(self):
883-
return self._field(4)
884-
property hour:
885-
def __get__(self):
886-
return self._field(5)
887-
property minute:
888-
def __get__(self):
889-
return self._field(6)
890-
property second:
891-
def __get__(self):
892-
return self._field(7)
893-
property weekofyear:
894-
def __get__(self):
895-
return self._field(8)
896-
property week:
897-
def __get__(self):
898-
return self.weekofyear
899-
property dayofweek:
900-
def __get__(self):
901-
return self._field(10)
902-
property weekday:
903-
def __get__(self):
904-
return self.dayofweek
905-
property dayofyear:
906-
def __get__(self):
907-
return self._field(9)
908-
property quarter:
909-
def __get__(self):
910-
return self._field(2)
911-
property qyear:
912-
def __get__(self):
913-
return self._field(1)
914-
property days_in_month:
915-
def __get__(self):
916-
return self._field(11)
917-
property daysinmonth:
918-
def __get__(self):
919-
return self.days_in_month
920-
property is_leap_year:
921-
def __get__(self):
922-
return bool(is_leapyear(self._field(0)))
929+
return pquarter(self.ordinal, base)
930+
931+
@property
932+
def qyear(self):
933+
base, mult = get_freq_code(self.freq)
934+
return pqyear(self.ordinal, base)
935+
936+
@property
937+
def days_in_month(self):
938+
base, mult = get_freq_code(self.freq)
939+
return pdays_in_month(self.ordinal, base)
940+
941+
@property
942+
def daysinmonth(self):
943+
return self.days_in_month
944+
945+
@property
946+
def is_leap_year(self):
947+
return bool(is_leapyear(self.year))
923948

924949
@classmethod
925950
def now(cls, freq=None):

0 commit comments

Comments
 (0)