首页 > 解决方案 > 如何连接列时间值在一定范围内且不是日期时间或时间戳对象的两个数据框?

问题描述

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

     time browncarbon blackcarbon
 181.7335    0.105270         NaN
 181.3809    0.166545    0.001217
 181.6197    0.071581         NaN

 422 rows x 3 columns

   start       end    toc 
179.9989  180.0002  155.0
180.0002  180.0016  152.0
180.0016  180.0030  151.0

1364 rows x 3 columns

第一个数据帧有一个时间列,每四分钟有一个瞬间。第二个数据帧有两个时间列,每两分钟间隔一次。这两个时间列不会同时开始和结束。但是,它们包含在同一天收集的数据。我怎样才能制作另一个包含以下内容的数据框:

time browncarbon blackcarbon toc

422 rows X 4 columns

但是,Stack Overflow 上有一个相关的答案,它仅适用于时间列是日期时间或时间戳对象的情况。链接是:如何连接列值在一定范围内的两个数据框?

附录1:封装到时间行之一的多个开始行和结束行也应该对应一个目录行,就像现在一样,但是,它应该是多个目录行的平均值,事实并非如此目前。

附录 2:合并两个条件复杂的 pandas 数据框

标签: python-3.xpandas

解决方案


我们创建一个人工键列来outer merge获取笛卡尔积(行之间的所有匹配项)。然后我们过滤所有时间在 范围内的行.query

注意:我编辑了一行的值,因此我们可以获得匹配项(请参阅底部示例数据框中的第 0 行)

df1.assign(key=1).merge(df2.assign(key=1), on='key', how='outer')\
   .query('(time >= start) & (time <= end)')\
   .drop(['key', 'start', 'end'], axis=1)

输出

       time  browncarbon  blackcarbon    toc
1  180.0008      0.10527          NaN  152.0

使用的示例数据框:

df1

       time  browncarbon  blackcarbon
0  180.0008     0.105270          NaN
1  181.3809     0.166545     0.001217
2  181.6197     0.071581          NaN

df2

      start       end    toc
0  179.9989  180.0002  155.0
1  180.0002  180.0016  152.0
2  180.0016  180.0030  151.0

推荐阅读