Skip to content
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

Lock down kwargs in offsets signatures #17458

Merged
merged 22 commits into from
Oct 6, 2017

Conversation

jbrockmendel
Copy link
Member

Explicitly specify allowed kwargs in __init__ for Week, WeekOfMonth, LastWeekOfMonth and QuarterOffset.

Ref #17176

Intended to be orthogonal/complementary to #17450.

Will add tests after confirming we're on the same page.

  • closes #xxxx
  • tests added / passed
  • passes git diff upstream/master -u -- "*.py" | flake8 --diff
  • whatsnew entry

@codecov
Copy link

codecov bot commented Sep 7, 2017

Codecov Report

Merging #17458 into master will decrease coverage by 0.01%.
The diff coverage is 100%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master   #17458      +/-   ##
==========================================
- Coverage   91.15%   91.14%   -0.02%     
==========================================
  Files         163      163              
  Lines       49591    49588       -3     
==========================================
- Hits        45207    45195      -12     
- Misses       4384     4393       +9
Flag Coverage Δ
#multiple 88.92% <100%> (-0.01%) ⬇️
#single 40.25% <26.66%> (-0.07%) ⬇️
Impacted Files Coverage Δ
pandas/tseries/offsets.py 97.14% <100%> (-0.01%) ⬇️
pandas/io/gbq.py 25% <0%> (-58.34%) ⬇️
pandas/core/frame.py 97.72% <0%> (-0.1%) ⬇️

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 20fee85...5e276c9. Read the comment docs.

@codecov
Copy link

codecov bot commented Sep 7, 2017

Codecov Report

Merging #17458 into master will decrease coverage by 0.02%.
The diff coverage is 100%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master   #17458      +/-   ##
==========================================
- Coverage   91.26%   91.24%   -0.03%     
==========================================
  Files         163      163              
  Lines       49872    49978     +106     
==========================================
+ Hits        45514    45600      +86     
- Misses       4358     4378      +20
Flag Coverage Δ
#multiple 89.04% <100%> (ø) ⬆️
#single 40.24% <30.35%> (-0.06%) ⬇️
Impacted Files Coverage Δ
pandas/tseries/offsets.py 97.16% <100%> (+0.01%) ⬆️
pandas/io/gbq.py 25% <0%> (-58.34%) ⬇️
pandas/core/indexing.py 93% <0%> (-0.98%) ⬇️
pandas/core/series.py 94.89% <0%> (-0.16%) ⬇️
pandas/core/frame.py 97.74% <0%> (-0.09%) ⬇️
pandas/core/generic.py 92.03% <0%> (-0.09%) ⬇️
pandas/core/common.py 91.42% <0%> (ø) ⬆️
pandas/core/ops.py 91.76% <0%> (ø) ⬆️
pandas/core/internals.py 94.38% <0%> (ø) ⬆️
pandas/core/indexes/period.py 92.78% <0%> (+0.01%) ⬆️
... and 8 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 81694dc...086b485. Read the comment docs.

Copy link
Contributor

@jreback jreback left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you add a whatsnew note in apbreaking (maybe a sub-section), where you note which thinks are changing, and how it could potentitally affect the user. In future PR's can expand this as things are added.

@jreback jreback added the Frequency DateOffsets label Sep 7, 2017
Restricting DateOffset Keywords
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Previously, ``DateOffset`` subclasses allowed arbitrary keyword arguments which could lead to unexpected behavior. Now, subclasses :class:`Week`, :class:`WeekOfMonth`, :class:`LastWeekOfMonth`, :class:`QuarterOffset`, :class:`QuarterEnd`, :class:`QuarterBegin`, :class:`BQuarterEnd`, and :class:`BQuarterBegin`, will allow only specific arguments. (:issue:`17176`).
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aren't Month/MonthEnd included here? why not all classes?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aren't Month/MonthEnd included here?

Not as of now, no.

why not all classes?

Wanted to change them a couple at a time, err on the side of doing too little. Now that #17486 is resolved I can push forward on a few more. You want to just get them all in one go?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes for this type of change am ok with doing it in one fell swoop. On the whatsnew just highlite the change generally (e.g. give a single example), then list the classes that are affected (or if its all, then just say all). imagine a user who just 'uses' pandas. They want to quickly get to: does this change affect me, if so, what do I need to do to fix.

Copy link
Contributor

@jreback jreback left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

in-line comment

@jbrockmendel jbrockmendel mentioned this pull request Sep 23, 2017
1 task
@jreback
Copy link
Contributor

jreback commented Sep 23, 2017

ok, rebase this and i'll look again.

@jbrockmendel
Copy link
Member Author

Will rebase, but I haven't gotten around to addressing your earlier comments, so this one isn't ready yet. #17564, #17585, #17363, #17543, and #17342 should be good to go.

@pep8speaks
Copy link

pep8speaks commented Sep 24, 2017

Hello @jbrockmendel! Thanks for updating the PR.

Cheers ! There are no PEP8 issues in this Pull Request. 🍻

Comment last updated on October 06, 2017 at 03:52 Hours UTC

@jbrockmendel
Copy link
Member Author

OK, as requested, the new commits cover all of the existing classes.

Copy link
Contributor

@TomAugspurger TomAugspurger left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lgtm. Feel free to merge @jreback

@@ -387,6 +387,13 @@ New Behavior

Additionally, DataFrames with datetime columns that were parsed by :func:`read_sql_table` and :func:`read_sql_query` will also be localized to UTC only if the original SQL columns were timezone aware datetime columns.

.. _whatsnew_0210.api.restricting_dateoffset_keywords

Restricting DateOffset Keywords
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ok, since we made this simpler, move to just a bullet point in Other API changes section.

@@ -1121,7 +1125,7 @@ class SemiMonthOffset(DateOffset):
_default_day_of_month = 15
_min_day_of_month = 2

def __init__(self, n=1, day_of_month=None, normalize=False, **kwds):
def __init__(self, n=1, normalize=False, day_of_month=None):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this consistent with other freq signatures?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

All the other signatures are (self, n=1, normalize=False, .... In the status quo this is an outlier.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes that's fine. see my comment below though.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is fine, in an ideal world we would change it but can't now

"""

def __init__(self, n=1, normalize=False, **kwds):
def __init__(self, n=1, normalize=False, weekday=None):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is there a test for this as weekday=None? isn't that an error?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It is an error, though a different one in Py2 vs Py3. In the status quo not passing a weekday explicitly will raise a KeyError. Default to Monday I guess?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

no if weekday is None, just raise a value error, in reality this should actually be the first (and a required parameter), but I guess that would be hard to change. Don't set defaults, raise

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are you suggesting it should be __init__(self, weekday, n=1, normalize=False)? I see some appeal to that, but there is a lot of symmetry with other signatures all starting with (self, n=1, normalize=False, ...).

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

see my comment above. this is ok for now. actually weekday is optional, so this is fine.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Two things. First, here and in other places you say "this is fine" but I don't know whether you're referring to the PR or the thing the PR is fixing. Based on the go-ahead you've given below to look over timeseries.rst I'm assuming you mean the PR version is fine, just heads up for ways I'm liable to get confused next time around.

actually weekday is optional,

Under the status quo, failing to pass weekday raises a KeyError. In the PR, not passing anything will raise a ValueError in py2 and TypeError in py3. (The same errors would result in the status quo if a user passed None explicitly)

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I never mean this entire PR is fine. If that was the case I wouldn't have any other comments. Individual comments are revering to the specific line/section where I make it.

@@ -1829,13 +1835,14 @@ class QuarterOffset(DateOffset):
# TODO: Consider combining QuarterOffset and YearOffset __init__ at some
# point

def __init__(self, n=1, normalize=False, **kwds):
def __init__(self, n=1, normalize=False, startingMonth=None):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

can you make an issue that this should be deprecated to starting_month (and prob others like this)

@jbrockmendel jbrockmendel mentioned this pull request Sep 26, 2017
59 tasks
Copy link
Contributor

@jreback jreback left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

looks fine, can you pass thru the timeseries.rst docs and if anything needs changing there (should be ok), but who knows

@jreback jreback added this to the 0.21.0 milestone Sep 26, 2017
S'YearBegin'
p1
ccopy_reg
_reconstructor
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not what i asked for at all

pls use the generate_legacy_data script
we have removed all of these ad hoc pickle things
we r not adding them back

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You asked me to run a script that doesn't work, then to troubleshoot it until it does. I found existing tests and followed their example. Please cut me some darn slack.

we have removed all of these ad hoc pickle things

test_pickle_v0_15_2 and test_pickle_compat_0_14_1 might lead a naive reader (such as myself) to suspect otherwise.

you can use pandas versions to do that ONLY in that script to do that.

This sentence confuses me.

If you make changes [to the generation script] then they should be checked in as part of this PR.

I have no interest in making changes to the non-functional generation script.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have no interest in making changes to the non-functional generation script.

well it works fine according to the instructions I gave and has been used for quite a while.

test_pickle_v0_15_2 and test_pickle_compat_0_14_1 might lead a naive reader

well if you look at what exists, the vast majority are in an organized format. The remaining ones should actually be converted to this format.

(pandas) bash-3.2$ find pandas -name '*pickle*'
pandas/compat/__pycache__/pickle_compat.cpython-36.pyc
pandas/compat/pickle_compat.py
pandas/io/__pycache__/pickle.cpython-36.pyc
pandas/io/pickle.py
pandas/tests/indexes/data/mindex_073.pickle
pandas/tests/indexes/data/multiindex_v1.pickle
pandas/tests/io/__pycache__/test_pickle.cpython-36-PYTEST.pyc
pandas/tests/io/data/categorical_0_14_1.pickle
pandas/tests/io/data/categorical_0_15_2.pickle
pandas/tests/io/data/legacy_pickle
pandas/tests/io/data/legacy_pickle/0.10.1/AMD64_windows_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.10.1/x86_64_linux_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.11.0/0.11.0_x86_64_linux_3.3.0.pickle
pandas/tests/io/data/legacy_pickle/0.11.0/x86_64_linux_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.11.0/x86_64_linux_3.3.0.pickle
pandas/tests/io/data/legacy_pickle/0.12.0/0.12.0_AMD64_windows_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.12.0/0.12.0_x86_64_linux_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_AMD64_windows_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_i686_linux_2.6.5.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_i686_linux_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_i686_linux_3.2.3.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_x86_64_darwin_2.7.5.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_x86_64_darwin_2.7.6.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_x86_64_linux_2.7.3.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_x86_64_linux_2.7.8.pickle
pandas/tests/io/data/legacy_pickle/0.13.0/0.13.0_x86_64_linux_3.3.0.pickle
pandas/tests/io/data/legacy_pickle/0.14.0/0.14.0_x86_64_darwin_2.7.6.pickle
pandas/tests/io/data/legacy_pickle/0.14.0/0.14.0_x86_64_linux_2.7.8.pickle
pandas/tests/io/data/legacy_pickle/0.14.1/0.14.1_x86_64_darwin_2.7.12.pickle
pandas/tests/io/data/legacy_pickle/0.14.1/0.14.1_x86_64_linux_2.7.8.pickle
pandas/tests/io/data/legacy_pickle/0.15.0/0.15.0_x86_64_darwin_2.7.12.pickle
pandas/tests/io/data/legacy_pickle/0.15.0/0.15.0_x86_64_linux_2.7.8.pickle
pandas/tests/io/data/legacy_pickle/0.15.2/0.15.2_x86_64_darwin_2.7.9.pickle
pandas/tests/io/data/legacy_pickle/0.16.0/0.16.0_x86_64_darwin_2.7.9.pickle
pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_2.7.10.pickle
pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_AMD64_windows_3.4.3.pickle
pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_x86_64_darwin_2.7.10.pickle
pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_x86_64_darwin_2.7.9.pickle
pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_x86_64_darwin_3.4.3.pickle
pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_2.7.10.pickle
pandas/tests/io/data/legacy_pickle/0.16.2/0.16.2_x86_64_linux_3.4.3.pickle
pandas/tests/io/data/legacy_pickle/0.17.0/0.17.0_AMD64_windows_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.17.0/0.17.0_AMD64_windows_3.4.4.pickle
pandas/tests/io/data/legacy_pickle/0.17.0/0.17.0_x86_64_darwin_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.17.0/0.17.0_x86_64_darwin_3.4.4.pickle
pandas/tests/io/data/legacy_pickle/0.17.0/0.17.0_x86_64_linux_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.17.0/0.17.0_x86_64_linux_3.4.4.pickle
pandas/tests/io/data/legacy_pickle/0.17.0/0.17.1_AMD64_windows_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.17.1/0.17.1_AMD64_windows_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.17.1/0.17.1_x86_64_darwin_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.18.0/0.18.0_AMD64_windows_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.18.0/0.18.0_AMD64_windows_3.5.1.pickle
pandas/tests/io/data/legacy_pickle/0.18.0/0.18.0_x86_64_darwin_2.7.11.pickle
pandas/tests/io/data/legacy_pickle/0.18.0/0.18.0_x86_64_darwin_3.5.1.pickle
pandas/tests/io/data/legacy_pickle/0.18.1/0.18.1_x86_64_darwin_2.7.12.pickle
pandas/tests/io/data/legacy_pickle/0.18.1/0.18.1_x86_64_darwin_3.5.2.pickle
pandas/tests/io/data/legacy_pickle/0.19.2/0.19.2_x86_64_darwin_2.7.12.pickle
pandas/tests/io/data/legacy_pickle/0.19.2/0.19.2_x86_64_darwin_3.6.1.pickle
pandas/tests/io/test_pickle.py
pandas/tests/tseries/data/cday-0.14.1.pickle
pandas/tests/tseries/data/dateoffset_0_15_2.pickle

As you know pandas is a very large library. If things do not have process & procedure around them, then future generations will have pain. We have worked pretty hard (and you are contributing to this), to reduce technical debt.

@jreback
Copy link
Contributor

jreback commented Oct 1, 2017

see #17733

@jreback
Copy link
Contributor

jreback commented Oct 1, 2017

@jbrockmendel
since we really are locking down signatures. I would write an old (but acceptable signature) and add to generate_legacy_storage_files (e.g. maybe with the kwargs or something). I think this will all work, just want to confirm.

@jreback
Copy link
Contributor

jreback commented Oct 1, 2017

I think I covered this case pandas/tests/tseries/data/dateoffset_0_15_2.pickle as well, so can remove that (now I didn't run it for 0.15.2 so you can certainly do that).

@jbrockmendel
Copy link
Member Author

Thanks for fixing the script. Added a file for 0.20.3 for kicks.

So since test_pickle_v0_15_2 isn't an example for what you want a test to look like I'm guessing iterate over the files unpickling them and checking that the data['offsets'] matches the off dict defined in generate_legacy_storage_files.create_data?

I think I covered this case pandas/tests/tseries/data/dateoffset_0_15_2.pickle as well, so can remove that (now I didn't run it for 0.15.2 so you can certainly do that).

There's some subject-verb ambiguity here. What did you cover/run? What can be removed?

I would write an old (but acceptable signature) and add to generate_legacy_storage_files (e.g. maybe with the kwargs or something)

So go into generate_legacy_storage_files and add something to the off dict and generate a new pickle file? But wouldn't that invalidate the existing files?

@jreback
Copy link
Contributor

jreback commented Oct 3, 2017

So go into generate_legacy_storage_files and add something to the off dict and generate a new pickle file? But wouldn't that invalidate the existing files?

no you can just generate a new one. We only compare to things that exist in the pickle AND in the generate script. So as long as you simply 'add' things its ok (e.g. don't rename or delete).

I added an offset section, you can simply add moar things to it (or even another version of it that say initializes with keyword args or somesuch).

@jbrockmendel
Copy link
Member Author

OK, so I generated a new file by running the script under 0.20.3. Then... what? The existing pickle tests in tests.tseries.test_offsets are precedent you've explicitly said not to follow.

@@ -502,6 +502,31 @@ def test_pickle_v0_15_2(self):
#
tm.assert_dict_equal(offsets, read_pickle(pickle_path))

def test_pickle_v0_20_3(self):
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

none of this is needed

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these go in the generate_legacy_storage_files script instead. (which you then use to generate). I think the instructions are now pretty clear. If they are not, feel free to update them as well (at the top of that file).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, just removed that test. As to the instructions, I'm still unclear on where the actual test goes and what it looks like.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

the test is generic it runs ALL of the pickle files

that’s the point you don’t actually need to construct a test just put a new pickle file

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK. test_pickle_v0_20_3 has been removed, so it sounds like we're good to go.

Copy link
Contributor

@jreback jreback left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

did you make changes in generate_legacy_storage_files? or just generate 0.20.3? I wanted you to update that with passing keywords so we can cover that as well, e.g.

ideally we would cover kwargs for most of the offsets.

In [3]: offsets.SemiMonthBegin(1, normalize=True, day_of_month=4)
Out[3]: <SemiMonthBegin: day_of_month=4>

This then assures that we have backcompat.

@jbrockmendel
Copy link
Member Author

Just added a handful of new examples to generate_legacy_storage_files, updated the 0.20.3 file, created a 0.19.2 file. Attempts to run under py3 raised

  File "pandas/pandas/tests/io/generate_legacy_storage_files.py", line 40, in <module>
    from pandas import (Series, DataFrame, Panel,
  File ".virtualenvs/pandas_0.19/lib/python3.6/site-packages/pandas/__init__.py", line 85, in <module>
    v = get_versions()
  File ".virtualenvs/pandas_0.19/lib/python3.6/site-packages/pandas/_version.py", line 23, in get_versions
    return json.loads(version_json)
AttributeError: module 'json' has no attribute 'loads'

@jreback
Copy link
Contributor

jreback commented Oct 6, 2017

also seems we should update the doc-strings for the offsets now that the signature are ok, xref #8435

@jreback
Copy link
Contributor

jreback commented Oct 6, 2017

File "pandas/pandas/tests/io/generate_legacy_storage_files.py", line 40, in
from pandas import (Series, DataFrame, Panel,
File ".virtualenvs/pandas_0.19/lib/python3.6/site-packages/pandas/init.py", line 85, in
v = get_versions()
File ".virtualenvs/pandas_0.19/lib/python3.6/site-packages/pandas/_version.py", line 23, in get_versions
return json.loads(version_json)
AttributeError: module 'json' has no attribute 'loads'

This is because we have a top-level file called json.py for backwards compat (was a c-module), which shadows the python json library, and the version things actually import this. So in this case you need to temporarily edit the pandas/_version.py file (in the version you are actually using) to avoid use of json (just change it to return a dict). a bit of a hack, but I have found no other way of fixing this (and it doesn't affect the released version, just running it like this).

@jreback
Copy link
Contributor

jreback commented Oct 6, 2017

ok this looks fine. Can you update the doc-strings? (also can do in another PR). now that the keywords are there they should be documented. lmk

@jreback jreback added this to the 0.21.0 milestone Oct 6, 2017
@jbrockmendel
Copy link
Member Author

Can you update the doc-strings? (also can do in another PR).

This PR has been exhausting. I'll put this on the TODO list.

@jreback
Copy link
Contributor

jreback commented Oct 6, 2017

@jbrockmendel hahah, ok thanks1

@jreback jreback merged commit e63c935 into pandas-dev:master Oct 6, 2017
ghost pushed a commit to reef-technologies/pandas that referenced this pull request Oct 16, 2017
@jbrockmendel jbrockmendel deleted the offset_sigs branch October 30, 2017 16:22
alanbato pushed a commit to alanbato/pandas that referenced this pull request Nov 10, 2017
No-Stream pushed a commit to No-Stream/pandas that referenced this pull request Nov 28, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Frequency DateOffsets
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants