Skip to content

Patch 5 #15

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 5 commits into from
Oct 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
1 change: 1 addition & 0 deletions doc/source/whatsnew/v0.21.0.txt
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,7 @@ Other Enhancements
- :meth:`DataFrame.assign` will preserve the original order of ``**kwargs`` for Python 3.6+ users instead of sorting the column names. (:issue:`14207`)
- Improved the import time of pandas by about 2.25x. (:issue:`16764`)
- :func:`read_json` and :func:`to_json` now accept a ``compression`` argument which allows them to transparently handle compressed files. (:issue:`17798`)
- :func:`Series.reindex`, :func:`DataFrame.reindex`, :func:`Index.get_indexer` now support list-like argument for ``tolerance``. (:issue:`17367`)

.. _whatsnew_0210.api_breaking:

Expand Down
104 changes: 77 additions & 27 deletions pandas/_libs/tslibs/fields.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
if field == 'is_month_start':
if is_business:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -172,7 +174,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
return out.view(bool)
else:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -185,7 +189,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
elif field == 'is_month_end':
if is_business:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -202,7 +208,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
return out.view(bool)
else:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -219,7 +227,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
elif field == 'is_quarter_start':
if is_business:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -232,7 +242,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
return out.view(bool)
else:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -245,7 +257,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
elif field == 'is_quarter_end':
if is_business:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -263,7 +277,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
return out.view(bool)
else:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -280,7 +296,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
elif field == 'is_year_start':
if is_business:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -293,7 +311,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
return out.view(bool)
else:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -306,7 +326,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
elif field == 'is_year_end':
if is_business:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -324,7 +346,9 @@ def get_start_end_field(ndarray[int64_t] dtindex, object field,
return out.view(bool)
else:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = 0; continue
if dtindex[i] == NPY_NAT:
out[i] = 0
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand Down Expand Up @@ -367,7 +391,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
if field == 'Y':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -377,7 +403,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'M':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -387,7 +415,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'D':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -397,7 +427,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'h':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -407,7 +439,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'm':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -417,7 +451,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 's':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -427,7 +463,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'us':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -437,7 +475,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'ns':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -446,7 +486,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'doy':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -457,7 +499,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'dow':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -467,7 +511,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'woy':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -477,7 +523,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
doy = mo_off + dts.day
dow = dayofweek(dts.year, dts.month, dts.day)

#estimate
# estimate
woy = (doy - 1) - dow + 3
if woy >= 0:
woy = woy / 7 + 1
Expand All @@ -498,7 +544,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'q':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -509,7 +557,9 @@ def get_date_field(ndarray[int64_t] dtindex, object field):
elif field == 'dim':
with nogil:
for i in range(count):
if dtindex[i] == NPY_NAT: out[i] = -1; continue
if dtindex[i] == NPY_NAT:
out[i] = -1
continue

pandas_datetime_to_datetimestruct(
dtindex[i], PANDAS_FR_ns, &dts)
Expand All @@ -522,7 +572,7 @@ def get_date_field(ndarray[int64_t] dtindex, object field):


cdef inline int days_in_month(pandas_datetimestruct dts) nogil:
return days_per_month_table[is_leapyear(dts.year)][dts.month -1]
return days_per_month_table[is_leapyear(dts.year)][dts.month - 1]


cpdef isleapyear_arr(ndarray years):
Expand Down
6 changes: 6 additions & 0 deletions pandas/core/dtypes/missing.py
Original file line number Diff line number Diff line change
Expand Up @@ -327,6 +327,12 @@ def array_equivalent(left, right, strict_nan=False):
left = left.view('i8')
right = right.view('i8')

# if we have structured dtypes, compare first
if (left.dtype.type is np.void or
right.dtype.type is np.void):
if left.dtype != right.dtype:
return False

return np.array_equal(left, right)


Expand Down
17 changes: 16 additions & 1 deletion pandas/core/generic.py
Original file line number Diff line number Diff line change
Expand Up @@ -2470,9 +2470,10 @@ def reindex_like(self, other, method=None, copy=True, limit=None,
Maximum number of consecutive labels to fill for inexact matches.
tolerance : optional
Maximum distance between labels of the other object and this
object for inexact matches.
object for inexact matches. Can be list-like.

.. versionadded:: 0.17.0
.. versionadded:: 0.21.0 (list-like tolerance)

Notes
-----
Expand Down Expand Up @@ -2860,7 +2861,14 @@ def sort_index(self, axis=0, level=None, ascending=True, inplace=False,
matches. The values of the index at the matching locations most
satisfy the equation ``abs(index[indexer] - target) <= tolerance``.

Tolerance may be a scalar value, which applies the same tolerance
to all values, or list-like, which applies variable tolerance per
element. List-like includes list, tuple, array, Series, and must be
the same size as the index and its dtype must exactly match the
index's type.

.. versionadded:: 0.17.0
.. versionadded:: 0.21.0 (list-like tolerance)

Examples
--------
Expand Down Expand Up @@ -3120,7 +3128,14 @@ def _reindex_multi(self, axes, copy, fill_value):
matches. The values of the index at the matching locations most
satisfy the equation ``abs(index[indexer] - target) <= tolerance``.

Tolerance may be a scalar value, which applies the same tolerance
to all values, or list-like, which applies variable tolerance per
element. List-like includes list, tuple, array, Series, and must be
the same size as the index and its dtype must exactly match the
index's type.

.. versionadded:: 0.17.0
.. versionadded:: 0.21.0 (list-like tolerance)

Examples
--------
Expand Down
Loading