BUG: DatetimeIndex.getitem with boolean Index mask with False raises TypeError · Issue #22533 · pandas-dev/pandas (original) (raw)

import pandas as pd
import pytz
import datetime
import functools


def isNotWeekendIfEndBeforeStart (idxDateTime, startTime, endTime):
    if idxDateTime.dayofweek < 4: return True
    if idxDateTime.dayofweek == 5: return False
    if idxDateTime.dayofweek == 4: return idxDateTime.time() <= endTime if endTime else True
    if idxDateTime.dayofweek == 6: return idxDateTime.time() > startTime if startTime else False
    return True

if __name__ == '__main__':
    # pd.show_versions()
    # print(pd.date_range(start=datetime.datetime(2016, 3, 18, 0, 0), end=datetime.datetime(2016, 3, 22, 0, 0), freq='D',
    #                     tz='UTC', closed='right'))
    nytz = pytz.timezone('America/New_York')
    startTimeBkt = nytz.localize(datetime.datetime(2018,6,1,22))
    endTimeBkt = nytz.localize(datetime.datetime(2018,7,31,10,15))

    print(startTimeBkt)
    print(endTimeBkt)

    rng = pd.date_range(start=startTimeBkt, end=endTimeBkt, freq='900S', tz=nytz, closed='right')
    #print(rng)

    startCut=datetime.time(17, tzinfo=nytz)
    endCut=datetime.time(15, tzinfo=nytz)
    print(startCut)
    print(endCut)

    removeWeekends = functools.partial(isNotWeekendIfEndBeforeStart, startTime=startCut, endTime=endCut)
    rng = rng[rng.map(removeWeekends)]
    print(rng)

The above code creates a datetimeindex of 15 minute intervals and then removes all rows deemed as weekend times (although weekends are not defined by midnight and use a specific time of day) This works with pandas version 19 but when I looked to upgrade a numpy error is returned. This occurs on both Python 2.7 and Python 3.6

Errors:

Pandas 0.20.3

Traceback (most recent call last):
File "PandasTest.py", line 41, in
rng = rng[rng.map(removeWeekends)]
File "%PY_HOME%\lib\site-packages\pandas\core\indexes\datetimelike.py", line 296, in getitem
result = getitem(key)
IndexError: only integers, slices (:), ellipsis (...), numpy.newaxis (None) and integer or boolean arrays are valid indices

Pandas 0.21.1

Traceback (most recent call last):
File "PandasTest.py", line 41, in
rng = rng[rng.map(removeWeekends)]
File "%PY_HOME%\lib\site-packages\pandas\core\indexes\datetimelike.py", line 279, in getitem
key = lib.maybe_booleans_to_slice(key.view(np.uint8))
File "%PY_HOME%\lib\site-packages\numpy\core_internal.py", line 365, in _view_is_safe
raise TypeError("Cannot change data-type for object array.")
TypeError: Cannot change data-type for object array.

Pandas 0.22.0

Traceback (most recent call last):
File "PandasTest.py", line 41, in
rng = rng[rng.map(removeWeekends)]
File "%PY_HOME%\lib\site-packages\pandas\core\indexes\datetimelike.py", line 279, in getitem
key = lib.maybe_booleans_to_slice(key.view(np.uint8))
File "%PY_HOME%\lib\site-packages\numpy\core_internal.py", line 365, in _view_is_safe
raise TypeError("Cannot change data-type for object array.")
TypeError: Cannot change data-type for object array.

Pandas 0.23.4

Traceback (most recent call last):
File "PandasTest.py", line 41, in
rng = rng[rng.map(removeWeekends)]
File "%PY_HOME%\lib\site-packages\pandas\core\indexes\datetimelike.py", line 411, in getitem
key = lib.maybe_booleans_to_slice(key.view(np.uint8))
File "%PY_HOME%\lib\site-packages\numpy\core_internal.py", line 365, in _view_is_safe
raise TypeError("Cannot change data-type for object array.")
TypeError: Cannot change data-type for object array.