【问题标题】:How to compare datetimes in two different dataframes如何比较两个不同数据框中的日期时间
【发布时间】:2020-03-15 02:43:41
【问题描述】:

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

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 中 df1.time 包含在 df1.from 和 df2.to 中的所有单元格。

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

我该如何继续?

谢谢

【问题讨论】:

    标签: python pandas


    【解决方案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
    

    【讨论】:

    • 对不起,我更好地解释了我的问题。在 df1.time 中,每秒有一行 24 小时,我想为 df2 的每一行删除 df2.from 和 df2.to 间隔中包含的 df1 中的所有单元格。
    • @andrea_r94 好的,我明白了,那么它只是多个范围的相同机制。我正在编辑答案
    • @andrea_r94 我编辑了答案以考虑多行 df2。
    猜你喜欢
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 2019-02-26
    • 1970-01-01
    相关资源
    最近更新 更多