将数据帧与时间戳和间隔合并

Posted

技术标签:

【中文标题】将数据帧与时间戳和间隔合并【英文标题】:merge dataframes with timestamps and intervals 【发布时间】:2019-06-22 09:41:28 【问题描述】:

我有两个数据框。

df1 包含数字和时间戳。这是一个非常大的集合。

df1.head()
Out[292]: 
2016-08-31 08:09:00     1.0
2016-08-31 08:11:00     7.0
2016-08-31 08:14:00    90.0

df2 包含区间

d2.head()
Out[292]:        
   start                 stop                         C
2016-08-31 08:09:00     2016-08-31 08:12:00         'a'
2016-08-31 08:13:00     2016-08-31 08:20:00         'b'
2016-08-31 08:20:00     2016-08-31 08:45:00         'c'

我想在df1 中添加一个新列C,这样C 的值就对应于df2 中包含df1 索引的区间的值。

预期结果

 df1.head()
    Out[292]:                      C
    2016-08-31 08:09:00     1.0   'a'
    2016-08-31 08:11:00     7.0   'a'
    2016-08-31 08:14:00    90.0   'b'

到目前为止,我已经尝试过:

 df1.loc[:,'C']=df1.index.map(lambda i:df2[np.logical_and(i>df2.starti<df2.stop)].C)

但在某些情况下,当 df2 的区间列表中缺少索引值时,它的效率极低并且崩溃。

如何有效地做到这一点?

【问题讨论】:

【参考方案1】:

首先由IntervalIndex.from_arrays 创建IntervalIndex

s = pd.IntervalIndex.from_arrays(df2['start'], df2['stop'], 'both')
print (s)
IntervalIndex([[2016-08-31 08:09:00, 2016-08-31 08:12:00], 
               [2016-08-31 08:13:00, 2016-08-31 08:20:00],
               [2016-08-31 08:20:00, 2016-08-31 08:45:00]],
              closed='both',
              dtype='interval[datetime64[ns]]')

然后set_index by new IntervalIndex 设置为由values 创建的数组的新列:

df1['C'] = df2.set_index(s).loc[df1.index, 'C'].values
print (df1)
                        A  C
2016-08-31 08:09:00   1.0  a
2016-08-31 08:11:00   7.0  a
2016-08-31 08:14:00  90.0  b

编辑:

s = pd.IntervalIndex.from_arrays(df2['start'].astype(np.int64), 
                                 df2['stop'].astype(np.int64), 'both')
print (s)
IntervalIndex([[1472630940000000000, 1472631120000000000], 
               [1472631180000000000, 1472631600000000000], 
               [1472631600000000000, 1472633100000000000]],
              closed='both',
              dtype='interval[int64]')

df1['C'] = df2.set_index(s).loc[df1.index.astype(np.int64), 'C'].values
print (df1)
                        A  C
2016-08-31 08:09:00   1.0  a
2016-08-31 08:11:00   7.0  a
2016-08-31 08:14:00  90.0  b

【讨论】:

df2.set_index(s) 返回错误:KeyError: ('datetime64[ns]', 'both') 这是一个很好的解决方案,很高兴了解 IntervalIndex @00__00__00 - 你的熊猫版本是什么? pd.__version__ Out[306]: '0.23.4' @00__00__00 - 嗯,可能的解决方案应该是通过.astype(np.int64) 将日期时间转换为本机格式并应用解决方案。

以上是关于将数据帧与时间戳和间隔合并的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Rust Diesel 中使用时间戳和间隔进行算术运算

Pandas 将多个数据帧与时间戳索引对齐

将 Pandas 数据帧与多索引列和不规则时间戳连接起来

合并具有不同时间戳(不同时间间隔)的两个数据帧

列出日期时间/值列表的插值

将没有唯一索引的数据帧与 Python 和 Pandas 合并 [重复]