全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

使用Pandas和NumPy高效合并基于时间范围的数据框

本文详细介绍了如何使用Pandas和NumPy高效合并两个数据框,其中一个数据框的某个时间戳需要落在另一个数据框定义的两个时间列之间。传统迭代方法在大数据量下效率低下,通过引入NumPy广播机制,可以显著提升合并操作的速度和灵活性,同时保持代码简洁,并能轻松扩展以应对更复杂的合并条件,但需注意潜在的内存消耗问题。

基于时间范围的Pandas数据框合并教程

在数据分析中,我们经常需要合并多个数据框。一种常见的复杂场景是,将一个数据框(df2)中的时间戳 (time_3) 与另一个数据框(df1)中定义的时间范围 (time_1 和 time_2) 进行匹配。具体需求是,如果 df2 中的 time_3 落在 df1 中某行的 time_1 和 time_2 之间,则将 df1 的该行与 df2 的对应行合并,并且 df1 的行可能会因多个匹配而重复。

问题描述与传统方法的局限性

假设我们有两个数据框:

  • df1 包含 time_1、time_2 和其他数据列,其中 time_1 和 time_2 定义了一个时间区间。
  • df2 包含 time_3 和其他数据列。

我们的目标是,对于 df1 的每一行,找到所有 df2 中 time_3 落在 df1 当前行 time_1 和 time_2 之间的行,并将它们合并。

一个直观但效率低下的方法是使用嵌套循环。例如,遍历 df1 的每一行,然后对 df2 的所有行进行筛选,找到匹配项后逐个追加到结果数据框。这种方法在数据量较小时尚可接受,但当数据框行数增多时,其 O(n*m) 的时间复杂度会导致性能急剧下降,尤其在Python的循环效率限制下,很容易出现“非常慢”的情况。

采用NumPy广播实现高效合并

为了解决传统迭代方法的效率问题,我们可以利用NumPy的广播(Broadcasting)机制。NumPy广播允许对不同形状的数组执行算术运算,其底层是高度优化的C语言实现,因此在处理大量数据时比Python循环快得多。

1. 准备数据

首先,确保数据框的时间列已正确转换为Pandas的datetime类型。此外,为了后续通过索引进行数据提取,建议重置两个数据框的索引,以确保索引是唯一的且从0开始的整数序列。

import pandas as pd
import numpy as np

# 示例数据创建
data1 = {
    'time_1': ['2025-10-01 04:02:00', '2025-10-01 04:03:00'],
    'time_2': ['2025-10-01 08:29:00', '2025-10-01 08:49:00'],
    'dummy_data': [-245.66, -1772.94]
}
df1 = pd.DataFrame(data1)
df1['time_1'] = pd.to_datetime(df1['time_1'])
df1['time_2'] = pd.to_datetime(df1['time_2'])

data2 = {
    'time_3': [
        '2025-10-01 06:21:13.238024',
        '2025-10-01 06:47:19.796628',
        '2025-10-01 07:37:06.438740',
        '2025-10-01 08:16:16.995256',
        '2025-10-01 08:33:53.081095'
    ],
    'dummy_data2': [-131.36, -236.27, 5.91, -134.03, -103.73]
}
df2 = pd.DataFrame(data2)
df2['time_3'] = pd.to_datetime(df2['time_3'])

# 重置索引,确保索引是唯一的整数序列
df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)

print("df1:\n", df1)
print("\ndf2:\n", df2)

2. 准备NumPy数组进行广播

为了进行广播比较,我们需要将相关的Pandas时间序列转换为NumPy数组。关键在于对 df1 的时间列进行重塑([:, None]),使其成为一个列向量,而 df2 的时间列则保持为行向量。这样,当它们进行比较时,NumPy会自动将它们扩展成一个 n * m 的矩阵(n 是 df1 的行数,m 是 df2 的行数),从而实现“每行对每行”的比较。

# 将时间列转换为NumPy数组
# df1的时间列转换为列向量,df2的时间列转换为行向量
t1 = df1["time_1"].to_numpy()[:, None] # 形状 (n, 1)
t2 = df1["time_2"].to_numpy()[:, None] # 形状 (n, 1)
t3 = df2["time_3"].to_numpy()         # 形状 (m,)

3. 执行广播比较并获取匹配索引

现在,我们可以执行时间范围的比较。t1

np.nonzero() 函数会返回这个布尔矩阵中所有 True 值的坐标。x 数组将包含匹配的 df1 行索引,y 数组将包含匹配的 df2 行索引。

# 执行广播比较:t3是否在t1和t2之间
# 结果是一个 n * m 的布尔矩阵
match_matrix = (t1 <= t3) & (t3 <= t2) # 使用 <= 包含边界

# 获取匹配的行索引
# x: df1中匹配行的索引
# y: df2中匹配行的索引
x, y = match_matrix.nonzero()

print("\n匹配的df1索引 (x):", x)
print("匹配的df2索引 (y):", y)

注意:原始问题中使用的 between 函数默认是左闭右开,即 time_1

4. 合并匹配的行

最后一步是根据 x 和 y 数组中记录的索引来提取 df1 和 df2 中对应的行,并将它们横向合并。df1.iloc[x] 会根据 x 中的索引提取 df1 的行,df2.iloc[y] 同理。pd.concat 函数用于将这两个提取出的子数据框按列(axis=1)合并。

# 根据匹配索引提取并合并数据框行
result = pd.concat(
    [
        df1.iloc[x].reset_index(drop=True), # 提取df1匹配行并重置索引
        df2.iloc[y].reset_index(drop=True), # 提取df2匹配行并重置索引
    ],
    axis=1, # 按列合并
)

print("\n合并结果:\n", result)

完整代码示例

import pandas as pd
import numpy as np

# 1. 示例数据创建
data1 = {
    'time_1': ['2025-10-01 04:02:00', '2025-10-01 04:03:00'],
    'time_2': ['2025-10-01 08:29:00', '2025-10-01 08:49:00'],
    'dummy_data': [-245.66, -1772.94]
}
df1 = pd.DataFrame(data1)
df1['time_1'] = pd.to_datetime(df1['time_1'])
df1['time_2'] = pd.to_datetime(df1['time_2'])

data2 = {
    'time_3': [
        '2025-10-01 06:21:13.238024',
        '2025-10-01 06:47:19.796628',
        '2025-10-01 07:37:06.438740',
        '2025-10-01 08:16:16.995256',
        '2025-10-01 08:33:53.081095'
    ],
    'dummy_data2': [-131.36, -236.27, 5.91, -134.03, -103.73]
}
df2 = pd.DataFrame(data2)
df2['time_3'] = pd.to_datetime(df2['time_3'])

# 2. 重置索引(如果原始索引不保证唯一或连续)
df1 = df1.reset_index(drop=True)
df2 = df2.reset_index(drop=True)

# 3. 准备NumPy数组进行广播
t1 = df1["time_1"].to_numpy()[:, None] # df1的time_1作为列向量
t2 = df1["time_2"].to_numpy()[:, None] # df1的time_2作为列向量
t3 = df2["time_3"].to_numpy()         # df2的time_3作为行向量

# 4. 执行广播比较
# 这里使用 <= 来包含边界,如果需要严格小于,请调整
match_matrix = (t1 <= t3) & (t3 <= t2)

# 5. 获取匹配的df1和df2的行索引
x, y = match_matrix.nonzero()

# 6. 根据匹配索引合并数据框行
result = pd.concat(
    [
        df1.iloc[x].reset_index(drop=True),
        df2.iloc[y].reset_index(drop=True),
    ],
    axis=1,
)

print("\n最终合并结果:\n", result)

注意事项与性能考量

  1. 内存消耗: NumPy广播生成 n * m 的布尔矩阵。如果 df1 和 df2 的行数 n 和 m 都非常大(例如,数百万行),那么这个 n * m 的矩阵可能会消耗巨大的内存,甚至导致内存溢出。在这种极端情况下,可能需要考虑其他更复杂的解决方案,例如分块处理、使用专门的区间树数据结构,或者数据库级别的区间连接功能。
  2. 索引重置: 在使用 iloc 之前重置索引 (reset_index(drop=True)) 是一个好习惯,可以避免因原始数据框索引不连续或重复而导致的问题。
  3. 条件扩展: NumPy广播的优势在于其灵活性。如果需要添加更多合并条件(例如,除了时间范围匹配外,还需要某个属性也匹配),可以轻松地在 match_matrix 的计算中添加额外的布尔条件,例如 (t1
  4. 时间精度: 确保所有时间列都转换为 datetime 对象,并且精度一致,以避免比较错误。

总结

利用NumPy的广播机制是解决Pandas中基于时间范围进行数据框合并的强大且高效的方法。它将原本需要嵌套循环的 O(n*m) 操作转化为高度优化的底层数组操作,显著提升了处理大规模数据的性能。虽然需要警惕内存消耗,但在大多数常见场景下,这种方法都是实现此类复杂合并操作的首选“Pandas-y”解决方案。


# python  # c语言  # 大数据 


相关文章: 南平网站制作公司,2025年南平市事业单位报名时间?  济南网站制作的价格,历城一职专官方网站?  建站之星×万网:智能建站系统+自助建站平台一键生成  如何用虚拟主机快速搭建网站?详细步骤解析  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  建站10G流量真的够用吗?如何应对访问高峰?  建站主机助手选型指南:2025年热门推荐与高效部署技巧  如何通过二级域名建站提升品牌影响力?  学校建站服务器如何选型才能满足性能需求?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  建站之星安装路径如何正确选择及配置?  常州自助建站:操作简便模板丰富,企业个人快速搭建网站  建站之星代理如何优化在线客服效率?  建站ABC备案流程中有哪些关键注意事项?  如何在阿里云高效完成企业建站全流程?  如何快速选择适合个人网站的云服务器配置?  浅析上传头像示例及其注意事项  jQuery 常见小例汇总  如何彻底卸载建站之星软件?  Bpmn 2.0的XML文件怎么画流程图  免费公司网站制作软件,如何申请免费主页空间做自己的网站?  香港服务器如何优化才能显著提升网站加载速度?  如何自定义建站之星网站的导航菜单样式?  香港服务器选型指南:免备案配置与高效建站方案解析  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  如何快速辨别茅台真假?关键步骤解析  公司网站制作价格怎么算,公司办个官网需要多少钱?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  如何设计高效校园网站?  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  北京网站制作网页,网站升级改版需要多久?  制作营销网站公司,淘特是干什么用的?  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  大学网站设计制作软件有哪些,如何将网站制作成自己app?  建站上传速度慢?如何优化加速网站加载效率?  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  如何选购建站域名与空间?自助平台全解析  ,怎么在广州志愿者网站注册?  如何高效完成自助建站业务培训?  如何在云主机上快速搭建多站点网站?  官网自助建站平台指南:在线制作、快速建站与模板选择全解析  如何确认建站备案号应放置的具体位置?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  官网建站费用明细查询_企业建站套餐价格及收费标准指南  如何在香港服务器上快速搭建免备案网站?  如何快速生成可下载的建站源码工具? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。