【问题标题】:Filter a larger DataFrame using date ranges from a smaller one使用较小的日期范围过滤较大的 DataFrame
【发布时间】:2018-04-19 11:47:52
【问题描述】:

对 pandas 还很陌生,所以我正在为此苦苦挣扎。

我有一个较大的 DataFrame,其中包含由包含 DatetimeIndex 的 MultiIndex 索引的记录,以及一个较小的 DataFrame,其中包含 DatetimeIndex 的开始日期和结束日期。它们的外观如下:

更大的数据框:

                       Data
PatId EntryDate  Id                                        
725   2005-01-03 1422  X
      2005-01-04 1563  X
      2005-01-05 1355  X
      2005-01-06 118   X
      2005-01-09 1400  X

以及包含日期范围的较小的:

                         PatId
EntryDate  ExitDate          
2005-01-15 2005-04-15   22407
2005-01-30 2005-04-30   95938
2005-02-07 2005-05-07  116812
2005-02-18 2005-05-18   12163
2005-02-21 2005-05-21   22908

我想要一种优雅而有效的方法来过滤较大的 DataFrame,以仅包含那些在较小 DataFrame 中定义的日期范围内的记录。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用:

    EntryDate = df2.index.get_level_values('EntryDate')
    ExitDate = df2.index.get_level_values('ExitDate')
    
    idx = np.concatenate([pd.date_range(s, e) for s, e in zip(EntryDate, ExitDate)])
    df = df1[df1.index.get_level_values('EntryDate').isin(np.unique(idx))]
    

    说明

    1. 首先通过get_level_values获取MultiIndex的值
    2. 循环创建date_ranges 并加入到一起
    3. 最后按isinboolean indexing 过滤,仅按unique 日期时间

    【讨论】:

      【解决方案2】:

      你可以做一个这样的简单过程:

      pd.concat([df.loc[:, start:end] for start, end in zip(df2.EntryDate, df2.ExitDate)])
      

      说明

      • DataFrames 允许使用日期时间或可解析为日期时间的字符串格式进行切片
      • 您需要将数据框过滤成更小的部分,然后将其连接起来
      • 剩下的就是一个简单的列表理解

      【讨论】:

      • 这看起来很整洁 - 谢谢。我稍微修改了它以将索引值与get_level_values 一起使用,我得到了ValueError: index must be monotonic increasing or decreasing。任何想法为什么?我的索引已排序...
      猜你喜欢
      • 2017-11-19
      • 1970-01-01
      • 2010-09-13
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多