-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
Implement roll_monthday, simplify SemiMonthOffset #18762
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
Changes from 16 commits
6100c3f
aac0832
c5bc5b2
15b7916
cb07e88
eb5e72f
ec3b24d
c6f025b
f5694de
2566bf5
0838271
a649238
425d3b4
71f138d
091acc2
365cdb8
9993a91
5d773a5
a5d9dee
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -523,11 +523,9 @@ def shift_quarters(int64_t[:] dtindex, int quarters, | |
n = quarters | ||
|
||
months_since = (dts.month - q1start_month) % modby | ||
compare_month = dts.month - months_since | ||
compare_month = compare_month or 12 | ||
# compare_day is only relevant for comparison in the case | ||
# where months_since == 0. | ||
compare_day = get_firstbday(dts.year, compare_month) | ||
compare_day = get_firstbday(dts.year, dts.month) | ||
|
||
if n <= 0 and (months_since != 0 or | ||
(months_since == 0 and dts.day > compare_day)): | ||
|
@@ -556,11 +554,9 @@ def shift_quarters(int64_t[:] dtindex, int quarters, | |
n = quarters | ||
|
||
months_since = (dts.month - q1start_month) % modby | ||
compare_month = dts.month - months_since | ||
compare_month = compare_month or 12 | ||
# compare_day is only relevant for comparison in the case | ||
# where months_since == 0. | ||
compare_day = get_lastbday(dts.year, compare_month) | ||
compare_day = get_lastbday(dts.year, dts.month) | ||
|
||
if n <= 0 and (months_since != 0 or | ||
(months_since == 0 and dts.day > compare_day)): | ||
|
@@ -827,7 +823,55 @@ cpdef int get_day_of_month(datetime other, day_opt) except? -1: | |
raise ValueError(day_opt) | ||
|
||
|
||
cpdef int roll_yearday(other, n, month, day_opt='start') except? -1: | ||
cpdef int _roll_convention(int other, int n, int compare): | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why is this private? |
||
""" | ||
Possibly increment or decrement the number of periods to shift | ||
based on rollforward/rollbackward conventions. | ||
|
||
Parameters | ||
---------- | ||
other : int, generally the day component of a datetime | ||
n : number of periods to increment, before adjusting for rolling | ||
compare : int, generally the day component of a datetime, in the same | ||
month as the datetime form which `other` was taken. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. this is very very confusing. you are using this in 2 separate ways. I would prefer 2 functions one for day one for month There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. So is the issue with the docstring in roll_convention? or the name? I dont think the function itself can be broken down any further. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would this concern be ameliorated if There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I think this is fine, but you are using this two differen types so make There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is it possible the diff is obfuscating the fact that roll_monthday was split several commits back into |
||
|
||
Returns | ||
------- | ||
n : int number of periods to increment | ||
""" | ||
if n > 0 and other < compare: | ||
n -= 1 | ||
elif n <= 0 and other > compare: | ||
# as if rolled forward already | ||
n += 1 | ||
return n | ||
|
||
|
||
cpdef int roll_monthday(datetime other, int n, datetime compare): | ||
""" | ||
Possibly increment or decrement the number of periods to shift | ||
based on rollforward/rollbackward conventions. | ||
|
||
Parameters | ||
---------- | ||
other : datetime | ||
n : number of periods to increment, before adjusting for rolling | ||
compare : datetime | ||
|
||
Returns | ||
------- | ||
n : int number of periods to increment | ||
""" | ||
if n > 0 and other < compare: | ||
n -= 1 | ||
elif n <= 0 and other > compare: | ||
# as if rolled forward already | ||
n += 1 | ||
return n | ||
|
||
|
||
cpdef int roll_qtrday(datetime other, int n, int month, day_opt='start', | ||
int modby=3) except? -1: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. make day_opt non-optional |
||
""" | ||
Possibly increment or decrement the number of periods to shift | ||
based on rollforward/rollbackward conventions. | ||
|
@@ -836,6 +880,48 @@ cpdef int roll_yearday(other, n, month, day_opt='start') except? -1: | |
---------- | ||
other : datetime or Timestamp | ||
n : number of periods to increment, before adjusting for rolling | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. does not match the signature |
||
month : int reference month giving the first month of the year | ||
day_opt : 'start', 'end', 'business_start', 'business_end' | ||
The convention to use in finding the day in a given month against | ||
which to compare for rollforward/rollbackward decisions. | ||
modby : int 3 for quarters, 12 for years | ||
|
||
Returns | ||
------- | ||
n : int number of periods to increment | ||
""" | ||
# TODO: Merge this with roll_yearday by setting modby=12 there? | ||
# code de-duplication versus perf hit? | ||
# TODO: with small adjustments this could be used in shift_quarters | ||
months_since = other.month % modby - month % modby | ||
|
||
if n > 0: | ||
if months_since < 0 or (months_since == 0 and | ||
other.day < get_day_of_month(other, | ||
day_opt)): | ||
# pretend to roll back if on same month but | ||
# before compare_day | ||
n -= 1 | ||
else: | ||
if (months_since > 0 or (months_since == 0 and | ||
other.day > get_day_of_month(other, | ||
day_opt))): | ||
# make sure to roll forward, so negate | ||
n += 1 | ||
return n | ||
|
||
|
||
cpdef int roll_yearday(datetime other, int n, int month, | ||
object day_opt='start') except? -1: | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. make not-optional |
||
""" | ||
Possibly increment or decrement the number of periods to shift | ||
based on rollforward/rollbackward conventions. | ||
|
||
Parameters | ||
---------- | ||
other : datetime or Timestamp | ||
n : number of periods to increment, before adjusting for rolling | ||
month : reference month giving the first month of the year | ||
day_opt : 'start', 'end' | ||
'start': returns 1 | ||
'end': returns last day of the month | ||
|
@@ -846,7 +932,7 @@ cpdef int roll_yearday(other, n, month, day_opt='start') except? -1: | |
|
||
Notes | ||
----- | ||
* Mirrors `roll_check` in tslib.shift_months | ||
* Mirrors `roll_check` in shift_months | ||
|
||
Examples | ||
------- | ||
|
@@ -888,7 +974,7 @@ cpdef int roll_yearday(other, n, month, day_opt='start') except? -1: | |
other.day < get_day_of_month(other, | ||
day_opt)): | ||
n -= 1 | ||
elif n <= 0: | ||
else: | ||
if other.month > month or (other.month == month and | ||
other.day > get_day_of_month(other, | ||
day_opt)): | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
this is not very intutive, nor should you generally be calling this as a public function of a cython routine. name this something else or create separate functions so compare is more readable here. I don't even mind repeating some code, as trying to shove multiple functions into the same one is simply a bad idea here.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I don't understand this comment. This is in reference to _roll_convention? I can rename it I guess, but I don't see how it could be separated into more specific functions.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
see below