如何比较两个不同数据框中的日期时间

时间:2019-11-19 14:35:19

标签: python pandas

我有两个不同的数据框,如下所示:

time  .. ...
2019-05-01 10:50:21
2019-05-01 10:50:22
2019-05-01 10:50:23
..

和同一行中的另一个:

from  to
2019-05-01 10:50:21 2019-05-01 10:55:21

我从两个不同的.csv导入了数据帧,并使用pd.to_datetime转换了时间戳

我想删除df1.from和df2.to中包含df1.time的df1中的所有单元格。

if df1.time > df2.from and df2.time < df2.to
  delete

我该如何进行?

谢谢

1 个答案:

答案 0 :(得分:1)

假设您的第一个数据帧始于2019-05-01 10:50:21,结束于2019-05-01 10:55:30。让我们在这里创建两个数据框:

import pandas as pd

a = pd.date_range("2019-05-01 10:50:21", "2019-05-01 10:55:50", freq='s')
df1 = pd.DataFrame({'time': a})

df2 = pd.DataFrame({
    "from": ["2019-05-01 10:50:21", "2019-05-01 10:55:30"], 
    "to": ["2019-05-01 10:55:21", "2019-05-01 10:55:45"]}, 
    index=[0, 1]
    ).apply(lambda s: pd.to_datetime(s))

我们可以使用date_range创建每个中间日期时间值,然后检查第一个数据帧的每个值是否属于此范围:

dt_ranges = [pd.date_range(row['from'], row['to'], freq='s') for _, row in df2.iterrows()]
dt_rng = pd.concat([pd.Series(ix) for ix in dt_ranges])

mask = df1.isin(dt_rng.values)
filtered = df1[~mask].dropna()
print(filtered)
                   time
301 2019-05-01 10:55:22
302 2019-05-01 10:55:23
303 2019-05-01 10:55:24
304 2019-05-01 10:55:25
305 2019-05-01 10:55:26
306 2019-05-01 10:55:27
307 2019-05-01 10:55:28
308 2019-05-01 10:55:29
325 2019-05-01 10:55:46
326 2019-05-01 10:55:47
327 2019-05-01 10:55:48
328 2019-05-01 10:55:49
329 2019-05-01 10:55:50