时间戳过滤

2024-04-25 00:27:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在处理这两个数据帧。df1是一个列表,列出了一个人可以做的潜在转变。而df2基本上就是他/她有空时的日程安排。你知道吗

起始点是班次/可用性的开始;结束点是班次/可用性的结束

我想消除所有潜在的转变,该人不能做,因为时间表。例如,你可以看到这个人上午不在,所以我应该删除n1中的0和3索引

我开始做类似的事情df1[df1.starts_at[0] >= df2.starts_at],但它不起作用

n1 = {'starts_at': {0: Timestamp('2019-06-02 09:00:00'),
  1: Timestamp('2019-06-02 17:00:00'),
  2: Timestamp('2019-06-02 14:00:00'),
  3: Timestamp('2019-06-03 09:30:00')},
 'ends_at': {0: Timestamp('2019-06-02 17:00:00'),
  1: Timestamp('2019-06-02 22:30:00'),
  2: Timestamp('2019-06-02 22:30:00'),
  3: Timestamp('2019-06-03 13:00:00')}}

n2 = {'starts_at': {0: Timestamp('2019-06-01 14:00:00'),
  1: Timestamp('2019-06-01 14:41:32.464000'),
  2: Timestamp('2019-06-01 15:00:00'),
  3: Timestamp('2019-06-02 10:00:00'),
  4: Timestamp('2019-06-02 14:00:00'),
  5: Timestamp('2019-06-02 17:00:00'),
  6: Timestamp('2019-06-02 17:30:00'),
  7: Timestamp('2019-06-03 17:00:00')},
 'ends_at': {0: Timestamp('2019-06-01 22:30:00'),
  1: Timestamp('2019-06-01 22:32:44.862000'),
  2: Timestamp('2019-06-01 22:30:00'),
  3: Timestamp('2019-06-02 18:30:00'),
  4: Timestamp('2019-06-03 00:00:00'),
  5: Timestamp('2019-06-03 00:00:00'),
  6: Timestamp('2019-06-02 21:00:00'),
  7: Timestamp('2019-06-03 23:00:00')}}

df1 = pd.DataFrame(n1)
df2 = pd.DataFrame(n2)

谢谢你的帮助


Tags: 数据dataframe列表时间表timestampatpddf1
2条回答

您可以使用^{}^{}with as ufunc with outer来同时比较两个df之间的所有“start\u at”,以及“ends\u at”的相同值。然后在列上使用any,以便能够捕获df1中任何可能的行:

mask = ( np.less_equal.outer(df1.starts_at, df2.starts_at)
         & np.greater_equal.outer(df1.ends_at, df2.ends_at)).any(1)
print (df1[mask])
            starts_at             ends_at
1 2019-06-02 17:00:00 2019-06-02 22:30:00
2 2019-06-02 14:00:00 2019-06-02 22:30:00

更详细地说,np.less_equal.outer(df1.starts_at, df2.starts_at)给出了一个数组,其中行是df1.starts_at的值,并将它们与df2中的起始值进行比较,我们要寻找的是df1中的起始值是否比df2中的起始值少(或早):

array([[False, False, False,  True,  True,  True,  True,  True],
       [False, False, False, False, False,  True,  True,  True],
       [False, False, False, False,  True,  True,  True,  True],
       [False, False, False, False, False, False, False,  True]])

您还可以使用numpybroadcasting电源:

i,j=np.where((df1.starts_at.values[:,None]>=df2.starts_at.values)&\
            (df1.ends_at.values[:,None]<=df2.ends_at.values))

#select values and remove duplicates
dfsel=df1.iloc[i][~df1.iloc[i].index.duplicated(keep='first')]

相关问题 更多 >