【问题标题】:Python Series - if it is between the values of two other series (time)Python 系列 - 如果它在其他两个系列的值之间(时间)
【发布时间】:2018-08-10 10:48:01
【问题描述】:

我有一个带有日期时间 (df1) 的数据框。我想知道 df1 中“col1”中的日期时间是否介于另一个数据帧 (df2) 中两列(“下界”和“上界”)的任何一对日期时间之间。

例如:

df1 = pd.to_datetime(['2014-04-09 07:37:00','2015-04-09 07:00:00',
                     '2014-02-02 08:31:00','2014-03-02 08:22:00'])
df1 = pd.DataFrame(df1,columns = ['col1'])

lowerbound = pd.to_datetime(['2014-04-09 07:25:00','2014-02-02 08:30:00',
                     '2015-04-09 06:00:00','2014-03-02 08:12:00'])  
upperbound = pd.to_datetime(['2014-04-09 07:38:00','2014-04-09 07:48:00',
                     '2015-04-09 08:00:00','2014-02-02 08:33:00')
df2 = pd.DataFrame(lowerbound,columns = ['lowerbound'])    
df2['upperbound'] = upperbound

结果应为 [1,1,0,0],因为:

  • df1['col1'][0] 介于 df2['lowerbound'][0] 和 df2['lowerbound'][0]
  • df1['col1'][1] 介于 df2['lowerbound'][2] & df2['lowerbound'][2]
  • 虽然 df1['col1'][2] 介于 df2['lowerbound'][1] & df2['lowerbound'][3] 之间,但 df2['lowerbound'] 和 df2['lowerbound' 的索引] 不一样。

谢谢!

【问题讨论】:

  • 似乎结果应该是[1,1,1,1] ?
  • @RafaelC 不是真的。例如,对于 df1['col1'][3]:'2014-03-02 08:22:00',它不在任何一对 df2['lowerbound'][x] 和 df2['lowerbound'] 之间[x] 表示 x 在 0-3 范围内。
  • 但那是因为您的 upperbound 值小于 lowerbound 值,这是没有意义的。
  • 确实,上限值小于下限值是没有意义的。这只是一个例子。

标签: python pandas datetime dataframe


【解决方案1】:

您可以在axis=1中使用np.greater_thannp.less_thanouterany,例如:

import numpy as np
print ((np.greater_equal.outer(df1.col1, df2.lowerbound)
       & np.less_equal.outer(df1.col1, df2.upperbound))
       .any(1).astype(int))

这里是你的数据[1 1 1 1]

【讨论】:

  • @Ben.T 谢谢!我认为这很有意义。但是,我不明白为什么我从这个解决方案中得到的结果和从 RafaelC 的解决方案中得到的结果不同..
  • @RafaelC 你知道为什么我们从两种解决方案中得到不同的结果吗?
  • @MATTHEW 在您给出的示例中,解决方案产生相同的结果。你能提供一个minimal reproducible example 他们不同的地方吗?
  • @RafaelC,我的错 - 这两种解决方案实际上给了我相同的答案。非常感谢!
【解决方案2】:

我相信在这种情况下你需要apply

df1.col1.apply(lambda dat: ((dat>= df2.lowerbound) & (dat <= df2.upperbound)).any())

【讨论】:

    猜你喜欢
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-30
    • 1970-01-01
    • 2019-03-23
    • 2017-09-30
    相关资源
    最近更新 更多