0

0

Pandas高级合并:整合不同时间间隔的DataFrame

心靈之曲

心靈之曲

发布时间:2025-12-09 14:53:08

|

999人浏览过

|

来源于php中文网

原创

Pandas高级合并:整合不同时间间隔的DataFrame

本教程详细阐述了如何使用pandas合并具有不同时间步长的dataframe,尤其是在处理不规则时间序列数据时。核心方法是利用 `pd.merge` 的 `how='outer'` 参数,确保所有数据帧中的独特时间戳都被保留,并对缺失值使用 `nan` 进行填充,从而实现数据的完整对齐和整合。

在数据分析和处理中,我们经常会遇到需要整合来自不同来源、但都基于时间序列的数据。这些数据可能以不同的采样频率或时间步长记录,例如10分钟、15分钟或30分钟间隔。直接使用简单的拼接(pd.concat)或内连接(pd.merge 默认行为)往往无法达到预期效果,因为它可能导致数据丢失或无法正确对齐。本教程将介绍如何利用Pandas的强大合并功能,特别是 pd.merge(how='outer'),来高效地解决这类问题,确保所有时间点的数据都被妥善保留。

核心问题与挑战

当合并多个具有不同时间戳间隔的DataFrame时,主要挑战在于:

  1. 保留所有独特的时间戳: 无论某个时间戳只存在于一个DataFrame中,还是存在于多个DataFrame中,最终结果都应包含所有这些时间戳。
  2. 正确对齐数据: 对于存在于多个DataFrame中的时间戳,其对应的数据应被正确合并到同一行。
  3. 处理缺失值: 如果某个时间戳在某个DataFrame中不存在,但在其他DataFrame中存在,则合并后该DataFrame对应列的数据应显示为 NaN。

传统的 pd.concat 函数通常用于堆叠DataFrame,而 pd.merge 的默认 inner 连接则只保留在所有DataFrame中都存在的键。这两种方法都无法满足上述“保留所有独特时间戳并填充 NaN”的需求。

解决方案:使用 pd.merge(how='outer')

pd.merge 函数结合 how='outer' 参数是解决此问题的理想方案。outer 合并(也称为全外连接)会返回所有DataFrame中所有匹配和不匹配的行,对于不匹配的行,缺失的列值将用 NaN 填充。

Magic AI Avatars
Magic AI Avatars

神奇的AI头像,获得200多个由AI制作的自定义头像。

下载

步骤详解

  1. 数据准备与时间戳转换: 首先,我们需要创建示例DataFrame,并确保所有时间戳列都已正确转换为Pandas的 datetime 对象。这是进行任何时间序列操作的关键前提。

    import pandas as pd
    import numpy as np
    
    # 示例数据
    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'])
    
    print("df1:\n", df1)
    print("\ndf2:\n", df2)
    print("\ndf3:\n", df3)
  2. 执行链式外连接合并: 通过链式调用 pd.merge,我们可以将多个DataFrame逐步合并。每次合并都使用 how='outer' 策略,以确保所有独特的时间戳都被累积到结果中。

    # 使用how='outer'进行合并
    # 第一次合并df1和df2
    result = pd.merge(df1, df2, on='Timestamp', how='outer')
    print("\n第一次合并 (df1, df2):\n", result)
    
    # 第二次合并结果与df3
    result = pd.merge(result, df3, on='Timestamp', how='outer')
    print("\n第二次合并 (result, df3):\n", result)
  3. 结果排序: 合并后的DataFrame可能不会按照时间戳顺序排列,因此需要对结果进行排序,以获得清晰、有序的时间序列数据。

    # 对最终结果按Timestamp排序
    result = result.sort_values('Timestamp').reset_index(drop=True)
    
    print("\n最终合并结果 (按Timestamp排序):\n", result)

完整代码示例

import pandas as pd
import numpy as np

# 1. 准备示例数据
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)

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

# 3. 使用how='outer'进行链式合并
result = pd.merge(df1, df2, on='Timestamp', how='outer')
result = pd.merge(result, df3, on='Timestamp', how='outer')

# 4. 对最终结果按Timestamp排序
result = result.sort_values('Timestamp').reset_index(drop=True)

print("最终合并结果:")
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

这个结果与问题中“desired result”完全一致,成功地将所有独特的时间戳整合到一起,并用 NaN 填充了缺失的数据。

注意事项与最佳实践

  • 时间戳类型统一: 确保所有参与合并的DataFrame的时间戳列都已转换为 datetime 类型。类型不一致会导致合并失败或结果不正确。
  • 性能考量: 对于非常大的DataFrame,链式合并可能会占用较多内存和计算时间。在这种情况下,可以考虑先创建一个包含所有独特时间戳的完整时间索引,然后对每个DataFrame进行 reindex 操作,最后再进行简单的 concat。
  • merge_asof 的适用性: Pandas提供了 pd.merge_asof 函数,专门用于近似合并时间序列数据。例如,它可以用于前向填充(direction='forward')、后向填充(direction='backward')或最近匹配(direction='nearest')。然而,在本教程所示的“保留所有独特时间戳并填充 NaN”的需求下,merge_asof 并不直接适用,因为它会尝试根据最近的时间戳填充值,而不是简单地保留 NaN。merge_asof 更适合于需要查找在某个时间点之前或之后最近的可用数据点来填充缺失值的情况。
  • 索引合并: 如果时间戳列被设置为DataFrame的索引,可以使用 df.join() 方法进行合并,其行为与 pd.merge 类似,并且在处理索引时可能更简洁。

总结

合并具有不同时间步长的Pandas DataFrame是数据处理中的常见任务。通过掌握 pd.merge 函数的 how='outer' 参数,我们可以有效地整合来自多个源的不规则时间序列数据,确保所有时间戳都得到保留,并用 NaN 标记缺失值。这种方法提供了一个强大而灵活的解决方案,适用于需要全面视图并精确对齐时间序列数据的场景。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

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

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

79

2025.12.04

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

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

32

2026.01.31

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

443

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

605

2023.08.10

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

74

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
誉天教育RHCE视频教程
誉天教育RHCE视频教程

共9课时 | 1.5万人学习

尚观Linux RHCE视频教程(二)
尚观Linux RHCE视频教程(二)

共34课时 | 6万人学习

尚观RHCE视频教程(一)
尚观RHCE视频教程(一)

共28课时 | 4.9万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号