¿Cuál es la mejor manera de obtener fechas entre, digamos, '2019-01-08' y '2019-01-16', del objeto pandas.DatetimeIndex dti como se construye a continuación? Idealmente, ¿alguna sintaxis concisa como dti['2019-01-08':'2019-01-16']?

import pandas as pd
dti = pd.bdate_range(start='2019-01-01', end='2019-02-15')

DatetimeIndex(['2019-01-01', '2019-01-02', '2019-01-03', '2019-01-04',
               '2019-01-07', '2019-01-08', '2019-01-09', '2019-01-10',
               '2019-01-11', '2019-01-14', '2019-01-15', '2019-01-16',
               '2019-01-17', '2019-01-18', '2019-01-21', '2019-01-22',
               '2019-01-23', '2019-01-24', '2019-01-25', '2019-01-28',
               '2019-01-29', '2019-01-30', '2019-01-31', '2019-02-01',
               '2019-02-04', '2019-02-05', '2019-02-06', '2019-02-07',
               '2019-02-08', '2019-02-11', '2019-02-12', '2019-02-13',
               '2019-02-14', '2019-02-15'],
              dtype='datetime64[ns]', freq='B')
2
Indominus 20 oct. 2019 a las 04:40

2 respuestas

La mejor respuesta

Si lee el código fuente de DatetimeIndex.__getitem__, las fechas individuales en un DatetimeIndex se almacenan en un DatetimeArray. Para admitir la división, debe obtener los índices enteros de la fecha de inicio y finalización en esa matriz. Le sugiero que presente una solicitud de función con el equipo de desarrollo de pandas.

Mientras tanto, puedes parchearlo en:

from pandas.core.indexes.datetimes import DatetimeIndex

__old_getitem = DatetimeIndex.__getitem__

def __new_getitem(index, key):
    if isinstance(key, slice):
        _key = index.slice_indexer(key.start, key.stop, key.step)
    else:
        _key = key

    return __old_getitem(index, _key)

DatetimeIndex.__getitem__ = __new_getitem

# Now you can slice
dti['2019-01-08':'2019-01-16':4]
1
Code Different 20 oct. 2019 a las 23:48

Puede hacerlo con slice_indexer para DateTimeIndex

pandas.DateTimeIndex.slice_indexer(start, stop, step, [...])

Devuelve los índices de los elementos de fecha y hora para que pueda pasarlo a dti

Ejemplo:

dti[dti.slice_indexer("2019-01-07", "2019-01-17")]
2
Pit_Storm 20 nov. 2020 a las 22:53