python - 检查时间戳列是否在另一个数据帧的日期范围内

标签 python pandas dataframe timestamp range

我有一个数据框 df_A,其中有两列“amin”和“amax”,这是一组时间范围。

我的目标是找出 df_B 中的列是否位于 df_A 'amin' 和 'amax' 列中的任何范围行之间。

df_A[['amin','amax'] ]

                  amin                   amax
          0 2016-07-16 19:37:03   2016-07-17 11:16:32
          1 2016-07-04 21:15:54   2016-07-05 10:57:46
          2 2016-07-24 23:30:41   2016-07-25 15:38:02
          3 2016-07-12 03:02:38   2016-07-12 22:11:01

df_B['created_date']

      created_date
   2016-07-17 01:16:32 
   2016-07-05 10:15:54  
   2016-07-12 12:11:01


df_A['amin'] = pd.to_datetime(df_A['amin'], errors='coerce')
df_A['amax'] = pd.to_datetime(df_A['amax'], errors='coerce')
df_B['created_date'] = pd.to_datetime(df_B['created_date'],errors='coerce')

def dt2epoch(value):
   epoch = (value - pd.to_datetime(datetime(2015,12,31).strftime('%Y-%m-%d %H:%M:%S.%f'))).total_seconds()
   return epoch    

df_A['amax_epoch']=df_A['amax'].apply(dt2epoch)
df_A['amin_epoch']=df_A['amin'].apply(dt2epoch)
df_B['created_date_epoch']=df_B['created_date'].apply(dt2epoch)


def make_tuple(row):
     n= len(row)
     row = [(x,row[n - 1]) for x in row]
     return row

minMaxTuple = minMax.apply(make_tuple, axis =1)

以上是我的代码的一部分,我在下面尝试过(不确定是否有必要):
  • 将它们转换为纪元值
  • 将 df_A 转换为元组。

  • 但是,df_A 和 df_B 的行数不同。另外,我没有任何 id 列可以将它们合并在一起。
    label = []
    
    for l in df_B['created_date_epoch']:
    
        if (m[0] for m in minMaxTuple) <= l <= (m[1] for m in minMaxTuple):
            label.append('1')
        else:
            label.append('0')
    

    但是,当我运行它时,我得到的“标签”结果是一个空列表。

    此外,标签应该是与 df_A 具有相同行数的列。

    最后,我想在 df_A 中添加一个新的“标签”列:
                                  minMaxTuple                      label
                (2016-07-16 19:37:03, 2016-07-17 11:16:32)            1
                (2016-07-04 21:15:54, 2016-07-05 10:57:46)            1 
                (2016-07-24 23:30:41, 2016-07-25 15:38:02)            0
                (2016-07-12 03:02:38, 2016-07-12 22:11:01)            1
    

    最佳答案

    与@dubbbdan 的答案非常相似,但使用 any 可能更简单和 and运算符(operator):

    any_in_range = lambda row, iterable: any(
        [(row[0] < x) & (x < row[1]) for x in iterable])
    df_A['label'] = df_A.apply(any_in_range, iterable=df_B['created_date'], axis=1)
    print df_A
    

    打印:
                     amin                amax  label
    0 2016-07-16 19:37:03 2016-07-17 11:16:32   True
    1 2016-07-04 21:15:54 2016-07-05 10:57:46   True
    2 2016-07-24 23:30:41 2016-07-25 15:38:02  False
    3 2016-07-12 03:02:38 2016-07-12 22:11:01   True
    

    关于python - 检查时间戳列是否在另一个数据帧的日期范围内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47715337/

    相关文章:

    javascript - Pymongo .eval() 与 Mongo shell --eval

    python - Django ORM 和工作单元

    python - 如何删除数据集中的重复值 : python

    python - 比较 Dataframe 中的每个值以创建新的 Dataframe

    python - 如何从 numpy 切片对象获取坐标

    python - 是否可以将 templateMatch 与二进制图像一起使用?我有一个错误

    pandas - Boxplot与pandas和groupby

    python - 根据字典值分配给数据框列

    python - 计算 Pandas 系列中下划线后的值

    python - 过滤异常和复杂的数据集