选择日期时间间隔内的行

时间:2018-12-12 16:28:58

标签: python pandas datetime dataframe

我正在尝试比较两个数据框,并从第一个数据框删除不在第二个数据框的日期之间的行(或者...选择那些 < / strong>在第二个数据框中的日期之间)。选择内容应包括在内。这可能真的很简单,但现在不为我点击。

示例数据如下。对于数据框1,可以使用从2018年7月1日到2018年11月30日开始的每日数据生成,并在``数字''列中使用随机数。数据帧1中的...用于显示跳过的数据,但数据在实际数据帧中。

数据框1:

               Number
Date
2018-07-01     15.2
2018-07-02     17.3
2018-07-03     19.5
2018-07-04     13.7
2018-07-05     19.1
...
2018-09-15     30.4
2018-09-16     25.7
2018-09-17     21.2
2018-09-18     19.7
2018-09-19     23.4
...
2018-11-01     30.8
2018-11-02     47.2
2018-11-03     25.3
2018-11-04     39.7
2018-11-05     43.8

数据框2:

              Change
Date
2018-07-02     Start
2018-07-04     End
2018-09-16     Start
2018-09-18     End
2018-11-02     Start
2018-11-04     End

在上面的示例中,输出应为:

               Number
Date
2018-07-02     17.3
2018-07-03     19.5
2018-07-04     13.7
2018-09-16     25.7
2018-09-17     21.2
2018-09-18     19.7
2018-11-02     47.2
2018-11-03     25.3
2018-11-04     39.7

2 个答案:

答案 0 :(得分:2)

您可以尝试一下,希望“开始”和“结束”一个接一个地排序。

df3 = pd.concat([df[i:j] for i,j in zip(df2.loc[df2['Change']=='Start'].index, df2.loc[df2['Change']=='End'].index)]))
             Number
Date              
2018-07-02    17.3
2018-07-03    19.5
2018-07-04    13.7
2018-09-16    25.7
2018-09-17    21.2
2018-09-18    19.7
2018-11-02    47.2
2018-11-03    25.3
2018-11-04    39.7

答案 1 :(得分:2)

您可以根据IntervalIndex的索引建立一个df2,并以对数时间进行搜索。

df2.index = pd.to_datetime(df2.index)
idx = pd.IntervalIndex.from_arrays(df2.index[df.Change == 'Start'], 
                                   df2.index[df.Change == 'End'],
                                   closed='both')

df1[idx.get_indexer(pd.to_datetime(df1.index)) > -1]

            Number
Date              
2018-07-02    17.3
2018-07-03    19.5
2018-07-04    13.7
2018-09-16    25.7
2018-09-17    21.2
2018-09-18    19.7
2018-11-02    47.2
2018-11-03    25.3
2018-11-04    39.7