【问题标题】:Pandas select dataframe rows between multiple date times熊猫在多个日期时间之间选择数据框行
【发布时间】:2021-12-14 08:56:06
【问题描述】:

当前df:

Date                 Power
2011-04-18 17:00:00  243.56
2011-04-18 17:00:01  245.83
2011-04-18 17:00:02  246.02
2011-04-18 17:00:03  245.72
2011-04-18 17:00:04  244.71
2011-04-18 17:00:05  245.93
2011-04-18 17:00:06  243.12
2011-04-18 17:00:07  244.72
2011-04-18 17:00:08  242.44
2011-04-18 17:00:09  246.42
2011-04-18 17:00:10  245.02
...                     ...

我有带有日期和浮点数的 df。日期是索引并且是唯一的。 我想根据下一个 df 中找到的日期创建一个新的 df。

     date start          date end
0    2011-04-18 17:00:01 2011-04-18 17:00:02
1    2011-04-18 17:00:05 2011-04-18 17:00:06
2    2011-04-18 17:00:08 2011-04-18 17:00:10
...                  ...                 ...

我希望得到:

Date                 Power
2011-04-18 17:00:01  245.83
2011-04-18 17:00:02  246.02
2011-04-18 17:00:05  245.93
2011-04-18 17:00:06  243.12
2011-04-18 17:00:08  242.44
2011-04-18 17:00:09  246.42
2011-04-18 17:00:10  245.02
...                     ...

换句话说,我想过滤初始 df 并找到在第二个 df 中找到的所有日期之间的所有行。

我想过使用 pandas.DataFrame.between_time。但问题是这只适用于 1 个给定的日期开始和日期结束。如何在许多不同的日期期间做到这一点?

【问题讨论】:

    标签: python pandas dataframe date datetime


    【解决方案1】:

    np.logical_or.reduce 与列表理解一起使用:

    L = [df1['Date'].between(s, e) for s, e in df2[['date start','date end']].to_numpy()]
    
    df = df1[np.logical_or.reduce(L)]
    print (df)
                      Date   Power
    1  2011-04-18 17:00:01  245.83
    2  2011-04-18 17:00:02  246.02
    5  2011-04-18 17:00:05  245.93
    6  2011-04-18 17:00:06  243.12
    8  2011-04-18 17:00:08  242.44
    9  2011-04-18 17:00:09  246.42
    10 2011-04-18 17:00:10  245.02
    

    如果DatetimeIndex 可以使用:

    L = [df1[s:e] for s, e in df2[['date start','date end']].to_numpy()]
    
    df = pd.concat(L)
    print (df)
                          Power
    Date                       
    2011-04-18 17:00:01  245.83
    2011-04-18 17:00:02  246.02
    2011-04-18 17:00:05  245.93
    2011-04-18 17:00:06  243.12
    2011-04-18 17:00:08  242.44
    2011-04-18 17:00:09  246.42
    2011-04-18 17:00:10  245.02
    
    
    
    L = [(df1.index >= s) & (df1.index <= e) 
         for s, e in df2[['date start','date end']].to_numpy()]
    
    df = df1[np.logical_or.reduce(L)]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-31
      • 2020-01-26
      • 2018-12-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      • 2023-03-20
      相关资源
      最近更新 更多