Skip to content

Remove unnecessary iNaT checks from _Period properties #17421

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 6 commits into from
Sep 15, 2017
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
59 changes: 59 additions & 0 deletions asv_bench/benchmarks/period.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,65 @@ def time_value_counts_pindex(self):
self.i.value_counts()


class Properties(object):
def setup(self):
self.per = Period('2017-09-06 08:28', freq='min')

def time_year(self):
self.per.year

def time_month(self):
self.per.month

def time_day(self):
self.per.day

def time_hour(self):
self.per.hour

def time_minute(self):
self.per.minute

def time_second(self):
self.per.second

def time_is_leap_year(self):
self.per.is_leap_year

def time_quarter(self):
self.per.quarter

def time_qyear(self):
self.per.qyear

def time_week(self):
self.per.week

def time_daysinmonth(self):
self.per.daysinmonth

def time_dayofweek(self):
self.per.dayofweek

def time_dayofyear(self):
self.per.dayofyear

def time_start_time(self):
self.per.start_time

def time_end_time(self):
self.per.end_time

def time_to_timestamp():
self.per.to_timestamp()

def time_now():
self.per.now()

def time_asfreq():
self.per.asfreq('A')


class period_standard_indexing(object):
goal_time = 0.2

Expand Down
127 changes: 76 additions & 51 deletions pandas/_libs/period.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -107,6 +107,8 @@ cdef extern from "period_helper.h":
int pday(int64_t ordinal, int freq) except INT32_MIN
int pweekday(int64_t ordinal, int freq) except INT32_MIN
int pday_of_week(int64_t ordinal, int freq) except INT32_MIN
# TODO: pday_of_week and pweekday are identical. Make one an alias instead
# of importing them separately.
int pday_of_year(int64_t ordinal, int freq) except INT32_MIN
int pweek(int64_t ordinal, int freq) except INT32_MIN
int phour(int64_t ordinal, int freq) except INT32_MIN
Expand Down Expand Up @@ -868,58 +870,81 @@ cdef class _Period(object):
dt64 = period_ordinal_to_dt64(val.ordinal, base)
return Timestamp(dt64, tz=tz)

cdef _field(self, alias):
@property
def year(self):
base, mult = get_freq_code(self.freq)
return pyear(self.ordinal, base)

@property
def month(self):
base, mult = get_freq_code(self.freq)
return pmonth(self.ordinal, base)

@property
def day(self):
base, mult = get_freq_code(self.freq)
return pday(self.ordinal, base)

@property
def hour(self):
base, mult = get_freq_code(self.freq)
return phour(self.ordinal, base)

@property
def minute(self):
base, mult = get_freq_code(self.freq)
return pminute(self.ordinal, base)

@property
def second(self):
base, mult = get_freq_code(self.freq)
return psecond(self.ordinal, base)

@property
def weekofyear(self):
base, mult = get_freq_code(self.freq)
return pweek(self.ordinal, base)

@property
def week(self):
return self.weekofyear

@property
def dayofweek(self):
base, mult = get_freq_code(self.freq)
return pweekday(self.ordinal, base)

@property
def weekday(self):
return self.dayofweek

@property
def dayofyear(self):
base, mult = get_freq_code(self.freq)
return pday_of_year(self.ordinal, base)

@property
def quarter(self):
base, mult = get_freq_code(self.freq)
return get_period_field(alias, self.ordinal, base)

property year:
def __get__(self):
return self._field(0)
property month:
def __get__(self):
return self._field(3)
property day:
def __get__(self):
return self._field(4)
property hour:
def __get__(self):
return self._field(5)
property minute:
def __get__(self):
return self._field(6)
property second:
def __get__(self):
return self._field(7)
property weekofyear:
def __get__(self):
return self._field(8)
property week:
def __get__(self):
return self.weekofyear
property dayofweek:
def __get__(self):
return self._field(10)
property weekday:
def __get__(self):
return self.dayofweek
property dayofyear:
def __get__(self):
return self._field(9)
property quarter:
def __get__(self):
return self._field(2)
property qyear:
def __get__(self):
return self._field(1)
property days_in_month:
def __get__(self):
return self._field(11)
property daysinmonth:
def __get__(self):
return self.days_in_month
property is_leap_year:
def __get__(self):
return bool(is_leapyear(self._field(0)))
return pquarter(self.ordinal, base)

@property
def qyear(self):
base, mult = get_freq_code(self.freq)
return pqyear(self.ordinal, base)

@property
def days_in_month(self):
base, mult = get_freq_code(self.freq)
return pdays_in_month(self.ordinal, base)

@property
def daysinmonth(self):
return self.days_in_month

@property
def is_leap_year(self):
return bool(is_leapyear(self.year))

@classmethod
def now(cls, freq=None):
Expand Down