【问题标题】:Pandas.DataFrame slicing with multiple date ranges具有多个日期范围的 Pandas.DataFrame 切片
【发布时间】:2016-11-11 00:15:59
【问题描述】:

我有一个包含 100,000 多行的日期时间索引数据框对象。我想知道是否有一种方便的方法使用 pandas 来获取多个日期范围内的此数据帧的子集。

例如,假设我们有两个日期范围:

(datetime.datetime(2016,6,27,0,0,0), datetime.datetime(2016,6,27,5,0,0)

(datetime.datetime(2016,6,27,15,0,0), datetime.datetime(2016,6,27,23,59,59)

假设我们想要获取第一个日期范围或第二个日期范围内的数据框对象的所有行,其中数据框对象每秒都有从2016-06-27 00:00:002016-06-27 23:59:59 的行。 pandas 中是否有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: python datetime pandas dataframe


    【解决方案1】:

    我觉得最好的选择是使用直接检查而不是使用 loc 函数:

    df = df[((df.index >= '2016-6-27') & (df.index <= '2016-6-27 5:00')) 
        | ((df.index >= '2016-6-27 15:00') & (df.index < '2016-6-28'))]
    

    它对我有用。

    带有切片的 loc 函数的主要问题是限制应该存在于实际值中,否则将导致 KeyError。

    【讨论】:

      【解决方案2】:

      two main ways 按日期对带有 DatetimeIndex 的 DataFrame 进行切片。

      • 按切片:df.loc[start:end]。如果有多个日期范围,则单个 切片可以与pd.concat 连接。

      • 通过布尔选择掩码:df.loc[mask]


      使用 pd.concat 和切片

      import numpy as np
      import pandas as pd
      np.random.seed(2016)
      
      N = 10**2
      df = pd.DataFrame(np.random.randint(10, size=(N, 2)), 
                        index=pd.date_range('2016-6-27', periods=N, freq='45T'))
      
      result = pd.concat([df.loc['2016-6-27':'2016-6-27 5:00'],
                          df.loc['2016-6-27 15:00':'2016-6-27 23:59:59']])
      

      产量

                           0  1
      2016-06-27 00:00:00  0  2
      2016-06-27 00:45:00  5  5
      2016-06-27 01:30:00  9  6
      2016-06-27 02:15:00  8  4
      2016-06-27 03:00:00  5  0
      2016-06-27 03:45:00  4  8
      2016-06-27 04:30:00  7  0
      2016-06-27 15:00:00  2  5
      2016-06-27 15:45:00  6  7
      2016-06-27 16:30:00  6  8
      2016-06-27 17:15:00  5  1
      2016-06-27 18:00:00  2  9
      2016-06-27 18:45:00  9  1
      2016-06-27 19:30:00  9  7
      2016-06-27 20:15:00  3  6
      2016-06-27 21:00:00  3  5
      2016-06-27 21:45:00  0  8
      2016-06-27 22:30:00  5  6
      2016-06-27 23:15:00  0  8
      

      请注意,与 Python 中使用的大多数切片语法不同,

      df.loc['2016-6-27':'2016-6-27 5:00']
      

      在两端都包含——切片定义了一个闭合区间,不是 半开区间。


      使用布尔选择掩码:

      mask = (((df.index >= '2016-6-27') & (df.index <= '2016-6-27 5:00')) 
              | ((df.index >= '2016-6-27 15:00') & (df.index < '2016-6-28')))
      result2 = df.loc[mask]
      assert result.equals(result2)
      

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      相关资源
      最近更新 更多