Pandas数据透视表:按半年(H1/H2)间隔进行数据聚合与索引转换

霞舞
发布: 2025-10-24 11:10:01
原创
366人浏览过

Pandas数据透视表:按半年(H1/H2)间隔进行数据聚合与索引转换

本教程详细介绍了如何使用pandas和numpy创建按半年(上半年h1、下半年h2)间隔聚合的数据透视表。通过结合年份和自定义的半年标识符作为索引,实现灵活的数据分组。文章还演示了如何将生成的多级索引转换为更直观的日期格式,以便于后续分析和可视化。

在数据分析中,我们经常需要对时间序列数据进行聚合,例如按年、按季度或按月。然而,有时业务需求可能需要更灵活的时间间隔,例如按半年(上半年H1:1-6月,下半年H2:7-12月)进行聚合。Pandas的pivot_table函数通常允许我们直接使用dt.year或dt.quarter进行分组,但对于自定义的半年间隔,我们需要更精细的控制。

1. 构建示例数据

首先,我们创建一个包含日期索引和随机数据的DataFrame,并添加一个用于透视的额外列(例如Vessel),以便更好地模拟实际场景。

import pandas as pd
import numpy as np

# 创建日期范围和随机数据
date_rng = pd.date_range(start='2023-01-01', end='2024-01-05', freq='D')
data = np.random.rand(len(date_rng), 3)
df = pd.DataFrame(data, columns=['Column1', 'Column2', 'Column3'], index=date_rng)

# 添加一个'Vessel'列,用于透视表的列
df["Vessel"] = np.random.randint(1, 5, size=len(date_rng))

print("原始DataFrame前5行:")
print(df.head())
登录后复制

2. 创建按半年间隔的数据透视表

实现半年间隔聚合的关键在于为pivot_table的index参数提供一个包含年份和半年标识符的列表。我们可以通过df.index.year获取年份,并通过np.where根据月份判断是上半年(H1)还是下半年(H2)。

# 使用年份和自定义的半年标识符作为索引
pivot_df = pd.pivot_table(
    df,
    index=[df.index.year, np.where(df.index.month <= 6, "H1", "H2")],
    columns="Vessel",
    values=["Column1", "Column2", "Column3"],
    aggfunc="nunique", # 聚合函数,这里使用计算唯一值数量
)

print("\n按半年间隔聚合的数据透视表:")
print(pivot_df)
登录后复制

上述代码中:

  • index=[df.index.year, np.where(df.index.month <= 6, "H1", "H2")]:这是核心部分。df.index.year提取了日期的年份。np.where(df.index.month <= 6, "H1", "H2")则根据月份判断,1-6月标记为"H1",7-12月标记为"H2"。这两个数组组合在一起,形成了数据透视表的多级行索引。
  • columns="Vessel":指定Vessel列作为透视表的列。
  • values=["Column1", "Column2", "Column3"]:指定需要聚合的数值列。
  • aggfunc="nunique":指定聚合函数为计算唯一值的数量。你可以根据需求选择其他聚合函数,如'sum'、'mean'、'count'等。

输出结果将是一个多级索引的DataFrame,其中第一级索引是年份,第二级索引是"H1"或"H2"。

AIBox 一站式AI创作平台
AIBox 一站式AI创作平台

AIBox365一站式AI创作平台,支持ChatGPT、GPT4、Claue3、Gemini、Midjourney等国内外大模型

AIBox 一站式AI创作平台 217
查看详情 AIBox 一站式AI创作平台
        Column1                   Column2                   Column3                  
Vessel        1     2     3     4       1     2     3     4       1     2     3     4
2023 H1    39.0  41.0  59.0  42.0    39.0  41.0  59.0  42.0    39.0  41.0  59.0  42.0
     H2    43.0  53.0  34.0  54.0    43.0  53.0  34.0  54.0    43.0  53.0  34.0  54.0
2024 H1     NaN   1.0   3.0   1.0     NaN   1.0   3.0   1.0     NaN   1.0   3.0   1.0
登录后复制

3. 将多级索引转换为日期格式

为了方便后续的时间序列分析或可视化,我们可能需要将这种年-半年的多级索引转换为标准的日期格式。例如,将"2023 H1"转换为"2023-01-01",将"2023 H2"转换为"2023-07-01"。

# 将多级索引转换为日期格式
pivot_df.index = [
    pd.to_datetime(f'{year}-{"01-01" if half == "H1" else "07-01"}') # H2通常从7月开始
    for year, half in pivot_df.index
]

print("\n索引转换为日期格式后的数据透视表:")
print(pivot_df)
登录后复制

这段代码通过列表推导式遍历原始多级索引的每个元组(year, half)。对于每个元组,它构建一个字符串,如果half是"H1",则使用'01-01'作为月份和日期,否则使用'07-01'。最后,pd.to_datetime将这些字符串转换为日期时间对象。

转换后的输出如下:

           Column1                   Column2                   Column3                  
Vessel           1     2     3     4       1     2     3     4       1     2     3     4
2023-01-01    48.0  44.0  43.0  46.0    48.0  44.0  43.0  46.0    48.0  44.0  43.0  46.0
2023-07-01    49.0  41.0  48.0  46.0    49.0  41.0  48.0  46.0    49.0  41.0  48.0  46.0
2024-01-01     1.0   1.0   NaN   3.0     1.0   1.0   NaN   3.0     1.0   1.0   NaN   3.0
登录后复制

4. 注意事项

  • 自定义聚合函数: aggfunc参数非常灵活,除了内置字符串(如'sum', 'mean', 'count', 'nunique')外,也可以传入自定义函数或函数列表。
  • 多列聚合: values参数可以接受单个列名或列名列表,以同时对多列进行聚合。
  • 处理缺失值: 在聚合过程中,如果某些时间段内没有数据,结果中可能会出现NaN。这可以通过fillna()等方法进行处理。
  • 灵活的时间间隔: 这种通过np.where或自定义函数创建分组标识符的方法,可以推广到任何自定义时间间隔的聚合,例如按财政年度、按季度中的特定月份等。

总结

通过结合Pandas的pivot_table功能与NumPy的条件逻辑,我们可以轻松实现按自定义半年间隔进行数据聚合的需求。这种方法不仅提供了强大的数据分组能力,而且通过后续的索引转换,使得处理结果更具可读性和实用性。掌握这种技巧,将有助于您在复杂时间序列数据分析中更加灵活高效。

以上就是Pandas数据透视表:按半年(H1/H2)间隔进行数据聚合与索引转换的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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