如何切片pandas.DatetimeIndex?

Ind*_*nus 2 datetime python-3.x pandas

是什么让之间,比方说日期的最佳方式,'2019-01-08'并且'2019-01-16',从pandas.DatetimeIndex对象dti的构造下面?理想情况下,一些简洁的语法,如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')
Run Code Online (Sandbox Code Playgroud)

小智 5

你可以用slice_indexer for DateTimeIndex

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

它返回日期时间项的索引,以便您可以将其传递给 dti

例子:

dti[dti.slice_indexer("2019-01-07", "2019-01-17")]
Run Code Online (Sandbox Code Playgroud)


Cod*_*ent 1

如果您阅读方法的源代码DatetimeIndex.__getitem__,a 中的各个日期DatetimeIndex存储在 a 中DatetimeArray。为了支持切片,您需要获取该数组中开始日期和停止日期的整数索引。我建议您向 pandas 开发团队提交功能请求。

同时,您可以在以下位置对其进行猴子修补:

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]
Run Code Online (Sandbox Code Playgroud)