【问题标题】:How to slice a pandas.DatetimeIndex?如何切片 pandas.DatetimeIndex?
【发布时间】:2020-02-16 13:04:26
【问题描述】:

从如下构造的pandas.DatetimeIndex 对象dti 中获取'2019-01-08''2019-01-16' 之间的日期的最佳方法是什么?理想情况下,一些简洁的语法,如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')

【问题讨论】:

    标签: python-3.x pandas datetime


    【解决方案1】:

    您可以使用slice_indexer for DateTimeIndex 完成此操作

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

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

    例子:

    dti[dti.slice_indexer("2019-01-07", "2019-01-17")]
    

    【讨论】:

      【解决方案2】:

      如果您阅读DatetimeIndex.__getitem__ 方法的源代码,DatetimeIndex 中的各个日期将存储在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]
      

      【讨论】:

      • 有什么办法可以直接切片,而不是先转成Series再转回DatetimeIndex。切片后我仍然会使用它作为索引。
      • 关于您的问题:我只是使用bdate_range 来方便创建DatetimeIndex 对象。实际上,DatetimeIndex 对象可以通过多种方式创建。
      猜你喜欢
      • 2012-10-25
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      • 2011-06-20
      • 1970-01-01
      • 2018-08-16
      • 2019-07-23
      相关资源
      最近更新 更多