讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

updream

一键生成高质量推广成片

Seko
Seko

AI短剧一键生成成片

立刻MV
立刻MV

低成本歌曲 MV、视频生成

Pandas数据合并:处理多时间频率DataFrame的完整指南

胖磊吖_1339

胖磊吖_1339

发布时间:2025-12-13 21:41:02

|

204人浏览过

|

来源于php中文网

原创

Pandas数据合并:处理多时间频率DataFrame的完整指南

本教程详细阐述了如何使用pandas高效合并具有不同时间步长的多个dataframe。通过利用`pd.merge`函数的`how='outer'`参数,我们能够将所有时间点的数据整合到一个统一的数据帧中,并自动处理缺失值,确保所有时间序列信息的完整性。文章提供了具体的代码示例和专业指导,帮助读者掌握此类复杂数据合并技巧。

引言

在数据分析和处理中,我们经常会遇到需要整合来自不同来源或以不同频率采集的时间序列数据。例如,传感器A每10分钟记录一次数据,传感器B每15分钟记录一次,而传感器C每30分钟记录一次。将这些具有不同时间步长(或称为时间粒度)的数据帧(DataFrame)合并成一个统一的视图,同时保留所有原始时间点并清晰标记缺失数据,是一个常见的挑战。本教程将深入探讨如何使用Pandas库有效地解决这一问题。

挑战分析:多时间频率数据合并

假设我们有三个DataFrame,df1、df2和df3,它们各自包含Timestamp列和对应的数据列(data1、data2、data3)。它们的时间步长分别为10分钟、15分钟和30分钟。

原始数据结构示例:

df1 (10分钟步长):

Timestamp data1
2019/04/02 10:00:00 1
2019/04/02 10:10:00 1
2019/04/02 10:20:00 1
2019/04/02 10:30:00 1

df2 (15分钟步长):

Timestamp data2
2019/04/02 10:00:00 2
2019/04/02 10:15:00 22
2019/04/02 10:30:00 222
2019/04/02 10:45:00 2222
2019/04/02 11:00:00 22222

df3 (30分钟步长):

Timestamp data3
2019/04/02 10:00:00 3
2019/04/02 10:30:00 33
2019/04/02 11:00:00 333
2019/04/02 11:30:00 3333

我们的目标是生成一个包含所有独特时间戳的合并DataFrame。对于在某个特定时间点上,如果某个原始DataFrame没有对应的数据,则其相应的数据列应显示为NaN(Not a Number)。

期望结果示例:

Timestamp data1 data2 data3
2019/04/02 10:00:00 1 2 3
2019/04/02 10:10:00 1 NaN NaN
2019/04/02 10:15:00 NaN 22 NaN
2019/04/02 10:20:00 1 NaN NaN
2019/04/02 10:30:00 1 222 33
2019/04/02 10:45:00 NaN 2222 NaN
2019/04/02 11:00:00 NaN 22222 333
2019/04/02 11:30:00 NaN NaN 3333

Pandas合并策略:outer连接的优势

Pandas提供了强大的merge函数来合并DataFrames。解决上述问题的关键在于使用how='outer'参数进行合并。

  • pd.merge()函数:用于根据一个或多个键列(这里是Timestamp)组合两个DataFrame。
  • how参数:定义了合并类型。
    • 'inner':只保留两个DataFrame中都存在的键。
    • 'left':保留左DataFrame的所有键,并匹配右DataFrame的键。
    • 'right':保留右DataFrame的所有键,并匹配左DataFrame的键。
    • 'outer':保留两个DataFrame中所有独特的键。如果某个键只存在于其中一个DataFrame中,则在另一个DataFrame对应的列中填充NaN。

how='outer'正是我们所需要的,它确保了所有DataFrame中的所有时间戳都会被包含在最终结果中,并且对于那些在特定时间点没有数据的列,会用NaN进行填充,完美符合我们的期望。

实施步骤与代码示例

下面我们将通过具体的Python代码演示如何实现这一合并过程。

步骤一:统一时间戳格式

在进行任何时间序列操作之前,确保Timestamp列是Pandas的datetime对象至关重要。这不仅可以保证正确的排序和比较,还能利用Pandas强大的时间序列功能。

import pandas as pd

# 示例数据创建 (与问题内容一致)
data1 = {'Timestamp': ['2019/04/02 10:00:00', '2019/04/02 10:10:00', '2019/04/02 10:20:00', '2019/04/02 10:30:00'],
         'data1': [1, 1, 1, 1]}
df1 = pd.DataFrame(data1)

data2 = {'Timestamp': ['2019/04/02 10:00:00', '2019/04/02 10:15:00', '2019/04/02 10:30:00', '2019/04/02 10:45:00', '2019/04/02 11:00:00'],
         'data2': [2, 22, 222, 2222, 22222]}
df2 = pd.DataFrame(data2)

data3 = {'Timestamp': ['2019/04/02 10:00:00', '2019/04/02 10:30:00', '2019/04/02 11:00:00', '2019/04/02 11:30:00'],
         'data3': [3, 33, 333, 3333]}
df3 = pd.DataFrame(data3)

# 将Timestamp列转换为datetime对象
df1['Timestamp'] = pd.to_datetime(df1['Timestamp'])
df2['Timestamp'] = pd.to_datetime(df2['Timestamp'])
df3['Timestamp'] = pd.to_datetime(df3['Timestamp'])

步骤二:执行外连接合并

由于pd.merge一次只能合并两个DataFrame,我们需要通过链式操作或迭代的方式逐步合并。这里,我们将df1与df2合并,然后将结果与df3合并。

# 首先合并df1和df2
result = pd.merge(df1, df2, on='Timestamp', how='outer')

# 接着将结果与df3合并
result = pd.merge(result, df3, on='Timestamp', how='outer')

步骤三:结果排序

合并后的DataFrame的行顺序可能不是严格按时间戳递增的。为了获得清晰、有序的时间序列数据,我们需要根据Timestamp列对结果进行排序。reset_index(drop=True)用于清理旧的索引。

# 根据Timestamp列对结果进行排序
result = result.sort_values('Timestamp').reset_index(drop=True)

完整代码示例

将以上所有步骤整合,得到完整的解决方案:

import pandas as pd

# 示例数据创建
data1 = {'Timestamp': ['2019/04/02 10:00:00', '2019/04/02 10:10:00', '2019/04/02 10:20:00', '2019/04/02 10:30:00'],
         'data1': [1, 1, 1, 1]}
df1 = pd.DataFrame(data1)

data2 = {'Timestamp': ['2019/04/02 10:00:00', '2019/04/02 10:15:00', '2019/04/02 10:30:00', '2019/04/02 10:45:00', '2019/04/02 11:00:00'],
         'data2': [2, 22, 222, 2222, 22222]}
df2 = pd.DataFrame(data2)

data3 = {'Timestamp': ['2019/04/02 10:00:00', '2019/04/02 10:30:00', '2019/04/02 11:00:00', '2019/04/02 11:30:00'],
         'data3': [3, 33, 333, 3333]}
df3 = pd.DataFrame(data3)

# 1. 将Timestamp列转换为datetime对象
df1['Timestamp'] = pd.to_datetime(df1['Timestamp'])
df2['Timestamp'] = pd.to_datetime(df2['Timestamp'])
df3['Timestamp'] = pd.to_datetime(df3['Timestamp'])

# 2. 执行外连接合并
# 先合并df1和df2
result = pd.merge(df1, df2, on='Timestamp', how='outer')
# 再将结果与df3合并
result = pd.merge(result, df3, on='Timestamp', how='outer')

# 3. 根据Timestamp列对结果进行排序并重置索引
result = result.sort_values('Timestamp').reset_index(drop=True)

print(result)

输出结果:

            Timestamp  data1    data2  data3
0 2019-04-02 10:00:00    1.0      2.0    3.0
1 2019-04-02 10:10:00    1.0      NaN    NaN
2 2019-04-02 10:15:00    NaN     22.0    NaN
3 2019-04-02 10:20:00    1.0      NaN    NaN
4 2019-04-02 10:30:00    1.0    222.0   33.0
5 2019-04-02 10:45:00    NaN   2222.0    NaN
6 2019-04-02 11:00:00    NaN  22222.0  333.0
7 2019-04-02 11:30:00    NaN      NaN 3333.0

可以看到,输出结果与我们期望的完全一致。

注意事项与进阶考量

  1. NaN值的处理:合并后生成的DataFrame中会包含许多NaN值。根据后续的数据分析或建模需求,可能需要对这些NaN值进行填充。常见的填充方法包括:

    • 前向填充 (Forward Fill):result.fillna(method='ffill'),用前一个有效值填充。
    • 后向填充 (Backward Fill):result.fillna(method='bfill'),用后一个有效值填充。
    • 插值 (Interpolation):result.interpolate(method='time'),根据时间序列特性进行插值。
    • 常数填充:result.fillna(0),用特定常数填充。 选择哪种方法取决于数据的性质和分析目标。
  2. merge_asof的适用场景:Pandas还提供了pd.merge_asof函数,它适用于合并“最近邻”的时间序列数据。例如,如果你想将一个高频数据与最近的低频数据匹配,而不是严格要求时间戳完全匹配时,merge_asof会非常有用。然而,对于本教程中要求保留所有时间点并显示NaN的需求,merge_asof并不适用,因为它会进行数据填充而非创建NaN。

  3. 性能优化:对于拥有数百万甚至数十亿行的大型DataFrame,直接使用pd.merge可能会消耗大量内存和时间。在这种情况下,可以考虑以下优化策略:

    • 设置Timestamp为索引:如果Timestamp列被设置为DataFrame的索引,Pandas在进行合并时可能会更高效。
    • 使用Dask:Dask是一个并行计算库,可以与Pandas API兼容,用于处理超出内存的大型数据集。
    • 预过滤数据:在合并之前,尽可能地筛选掉不必要的数据行。
  4. 列名冲突:如果不同DataFrame中除了Timestamp之外还有其他同名列,pd.merge会自动添加后缀(如_x, _y)来区分它们。可以通过suffixes参数自定义这些后缀。

总结

本教程详细介绍了如何使用Pandas的pd.merge函数结合how='outer'参数,有效地合并具有不同时间步长的多个DataFrame。通过将时间戳列统一为datetime格式,并逐步进行外连接合并,最终得到了一个包含所有时间点和相应数据的统一视图,其中缺失值以NaN表示。理解并掌握这种合并策略对于处理复杂的时间序列数据至关重要,它为后续的数据清洗、分析和建模奠定了坚实的基础。同时,文章也提醒了NaN值的后续处理以及merge_asof等其他合并方法的适用性,帮助读者在实际工作中做出更明智的选择。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

码上飞
码上飞 Hot

一款基于自然语言的AI应用开发平台,可根据用户描述自动生成应用程序,帮助个人和团队快速完成应用原型与开发。

相关专题

更多
Python 时间序列分析与预测
Python 时间序列分析与预测

本专题专注讲解 Python 在时间序列数据处理与预测建模中的实战技巧,涵盖时间索引处理、周期性与趋势分解、平稳性检测、ARIMA/SARIMA 模型构建、预测误差评估,以及基于实际业务场景的时间序列项目实操,帮助学习者掌握从数据预处理到模型预测的完整时序分析能力。

360

2025.12.04

Python 数据清洗与预处理实战
Python 数据清洗与预处理实战

本专题系统讲解 Python 在数据清洗与预处理中的核心技术,包括使用 Pandas 进行缺失值处理、异常值检测、数据格式化、特征工程与数据转换,结合 NumPy 高效处理大规模数据。通过实战案例,帮助学习者掌握 如何处理混乱、不完整数据,为后续数据分析与机器学习模型训练打下坚实基础。

272

2026.01.31

Python数据分析与Pandas高级实战
Python数据分析与Pandas高级实战

本专题围绕 Python 数据分析展开,系统讲解 Pandas 的高级用法,包括数据清洗、透视表、时间序列分析以及多表合并与分组操作。通过实战案例,帮助开发者掌握高效处理与分析数据的方法,提高数据处理效率与分析能力。

871

2026.04.13

treenode的用法
treenode的用法

​在计算机编程领域,TreeNode是一种常见的数据结构,通常用于构建树形结构。在不同的编程语言中,TreeNode可能有不同的实现方式和用法,通常用于表示树的节点信息。更多关于treenode相关问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2841

2023.12.01

C++ 高效算法与数据结构
C++ 高效算法与数据结构

本专题讲解 C++ 中常用算法与数据结构的实现与优化,涵盖排序算法(快速排序、归并排序)、查找算法、图算法、动态规划、贪心算法等,并结合实际案例分析如何选择最优算法来提高程序效率。通过深入理解数据结构(链表、树、堆、哈希表等),帮助开发者提升 在复杂应用中的算法设计与性能优化能力。

396

2025.12.22

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

437

2026.01.06

C++ 数据结构与算法实现教程合集
C++ 数据结构与算法实现教程合集

以 C++ 为实现语言,系统讲解核心数据结构与算法,涵盖链表(单链表/双链表/环检测)、栈与队列(单调栈/优先队列)、二叉树(遍历/BST/AVL/红黑树)、哈希表(开地址法/链地址法)、图(邻接表/BFS/DFS/Dijkstra/拓扑排序)、常见排序算法(快排/归并/堆排/计数排序)的实现与复杂度分析,同时分享 LeetCode 刷题技巧、竞赛编程常用模板(二分/前缀和/滑动窗口/动态规划),帮助开发者夯实算法基础。

492

2026.05.09

传感器故障解决方法
传感器故障解决方法

传感器故障排除指南:识别故障症状(如误读或错误代码)。检查电源和连接(确保连接牢固,无损坏)。校准传感器(遵循制造商说明)。诊断内部故障(目视检查、信号测试、环境影响评估)。更换传感器(选择相同规格,遵循安装说明)。验证修复(检查信号准确性,监测异常行为)。

4784

2024.06.04

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

40

2026.11.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn