Python 删除第二个数据帧间隔中的数据帧时间戳

Python 删除第二个数据帧间隔中的数据帧时间戳,python,pandas,merge,timestamp,intervals,Python,Pandas,Merge,Timestamp,Intervals,给定:两个数据帧的列=(id,timestamp),另一个数据帧的列=(id,start\u interval,end\u interval),id总是相同的。其中一个由timestemp每秒组成,另一个只有时间戳间隔 df_时间戳 id timestamp 1 11006 1365 2 11006 1366 3 11006 1367 4 11006 1368 5 11006 1369 ... 101 1

给定:两个数据帧的列=(id,timestamp),另一个数据帧的列=(id,start\u interval,end\u interval),id总是相同的。其中一个由timestemp每秒组成,另一个只有时间戳间隔

df_时间戳

    id      timestamp
1   11006   1365       
2   11006   1366       
3   11006   1367
4   11006   1368
5   11006   1369   
...
101 11006   1465
102 11006   1466
103 11006   1467
104 11006   1468
...
df_间隔

    id      start_interval    end_interval
1   11006   1250              1366
2   11006   1369              1455
...
12  11006   1466              1467
13  11006   1620              1950
...
任务:我需要创建一个新的数据帧,其中df_timestamp['timestamp']值不在df_interval'interval'值之内或之间

输出:

新德里

   id     timestamp  
1  11006  1367       
2  11006  1368 
...
77 11006  1465
78 11006  1468
...
我试图
merge()。还尝试添加一些逻辑表达式,但失败了。合并的案例似乎有效,但运行起来需要无限的时间。此外,合并后需要合适的
.loc


有没有更优雅、更有效的方法呢?

如果我理解正确,您需要它:

crit=  df_timestamp.timestamp.isin(df_intervals.start_interval) \
     | df_timestamp.timestamp.isin(df_intervals.end_interval)

df_timestamp.loc[~crit]                                                                                              
编辑:

#For readablity:
    df_interval, df_timestamp= dfi,dft


    matched= dft.groupby( lambda idx: \
                           (  dfi.start_interval.le(dft.loc[idx,"timestamp"]) \
                            & dfi.end_interval.ge(dft.loc[idx,"timestamp"])).any() ) \
                    .groups[False]                                                                               

    Out:
       df_timestamp.loc[matched]  

index     id  timestamp
2          3  11006     1367.0
3          4  11006     1368.0
5  101 11006   1465        NaN
6  102 11006   1466        NaN
7  103 11006   1467        NaN
8  104 11006   1468        NaN
EDIT2: prevoius代码的变体,具有列表理解:

dft.loc[ [(dfi.start_interval.gt(ts) | dfi.end_interval.lt(ts)).all() for ts in dft.timestamp] ]

如果我理解正确,您需要它:

crit=  df_timestamp.timestamp.isin(df_intervals.start_interval) \
     | df_timestamp.timestamp.isin(df_intervals.end_interval)

df_timestamp.loc[~crit]                                                                                              
编辑:

#For readablity:
    df_interval, df_timestamp= dfi,dft


    matched= dft.groupby( lambda idx: \
                           (  dfi.start_interval.le(dft.loc[idx,"timestamp"]) \
                            & dfi.end_interval.ge(dft.loc[idx,"timestamp"])).any() ) \
                    .groups[False]                                                                               

    Out:
       df_timestamp.loc[matched]  

index     id  timestamp
2          3  11006     1367.0
3          4  11006     1368.0
5  101 11006   1465        NaN
6  102 11006   1466        NaN
7  103 11006   1467        NaN
8  104 11006   1468        NaN
EDIT2: prevoius代码的变体,具有列表理解:

dft.loc[ [(dfi.start_interval.gt(ts) | dfi.end_interval.lt(ts)).all() for ts in dft.timestamp] ]

感谢您的回答,但也不能在两次间隔之间查看上面编辑的代码。我想知道这个解决方案是否比您的解决方案更快或更“优雅”。谢谢您的回答,但它也不能在间隔之间。请参阅上面编辑的代码。我想知道这个解决方案是否比你的更快或更“优雅”。