-
-
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
Merged
Merged
Changes from all commits
Commits
Show all changes
19 commits
Select commit
Hold shift + click to select a range
6100c3f
implement roll_monthday, roll_qtrday, notes on possible bugs
jbrockmendel aac0832
simplify SemiMonth.apply
jbrockmendel c5bc5b2
whitespace/comment fixup
jbrockmendel 15b7916
Merge branch 'master' of https://github.com/pandas-dev/pandas into qt…
jbrockmendel cb07e88
flake8 indentation cleanup
jbrockmendel eb5e72f
deprivatize and type roll_monthday
jbrockmendel ec3b24d
docstrings, de-privatize, types
jbrockmendel c6f025b
avoid while loop[ in BusinessDay.apply
jbrockmendel f5694de
docstring edits
jbrockmendel 2566bf5
add typing
jbrockmendel 0838271
Merge branch 'master' of https://github.com/pandas-dev/pandas into qt…
jbrockmendel a649238
dummy commit to force CI
jbrockmendel 425d3b4
Merge branch 'master' of https://github.com/pandas-dev/pandas into qt…
jbrockmendel 71f138d
Separate int and datetime roll funcs
jbrockmendel 091acc2
Merge branch 'master' of https://github.com/pandas-dev/pandas into qt…
jbrockmendel 365cdb8
Merge branch 'master' of https://github.com/pandas-dev/pandas into qt…
jbrockmendel 9993a91
add tests for liboffsets funcs
jbrockmendel 5d773a5
Merge branch 'master' of https://github.com/pandas-dev/pandas into qt…
jbrockmendel a5d9dee
Merge branch 'master' of https://github.com/pandas-dev/pandas into qt…
jbrockmendel File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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): | ||
""" | ||
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. | ||
|
||
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, object day_opt, | ||
int modby=3) except? -1: | ||
""" | ||
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) except? -1: | ||
""" | ||
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)): | ||
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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 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 comment
The 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 comment
The reason will be displayed to describe this comment to others. Learn more.
Would this concern be ameliorated if
roll_monthday
were removed? I expect all of the places where it is used are eventually going to be simplified/fixed to useroll_convention
(or something equivalent)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 think this is fine, but you are using this two differen types so make
roll_monthday_interger
,roll_monthday_datetime
or whatever. have 1 function do 1 thing.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.
Is it possible the diff is obfuscating the fact that roll_monthday was split several commits back into
roll_monthday
(which takes datetimes) androll_convention
(which takes ints)?