讲师中心 微信公众号

工具推荐

视频效率加速
AniShort
AniShort

AI短剧协同制作平台

剧云
剧云

中文短剧剧本制作平台

Seko
Seko

AI短剧一键生成成片

Laper
Laper

剧本策划到成片协作

使用Pandas创建按半年间隔分组的数据透视表

阿杰姑娘_9232

阿杰姑娘_9232

发布时间:2025-10-24 13:20:04

|

603人浏览过

|

来源于php中文网

原创

使用Pandas创建按半年间隔分组的数据透视表

本文详细介绍了如何利用pandas库创建按半年(上半年/下半年)间隔分组的数据透视表,而非传统的按年分组。通过结合年份和月份条件判断,实现自定义的时间周期聚合,并进一步演示了如何将生成的多级索引转换回标准的日期格式,以提高数据分析和可视化的灵活性。

引言

在数据分析中,我们经常需要对时间序列数据进行聚合和汇总。Pandas的pivot_table功能非常强大,可以方便地按年、季度、月等标准时间单位进行分组。然而,在某些业务场景下,我们可能需要更灵活的自定义时间间隔,例如按半年(上半年H1、下半年H2)进行数据汇总。本文将详细讲解如何实现这一需求,并提供将自定义索引转换回日期格式的方法。

准备示例数据

首先,我们创建一个包含日期索引和随机数据的Pandas DataFrame作为示例。为了与问题描述保持一致,我们还添加了一个Vessel列,用于在数据透视表中作为列。

import pandas as pd
import numpy as np

# 创建日期范围从2023年1月1日到2024年1月5日
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())

创建按半年间隔分组的数据透视表

要实现按半年间隔分组,我们需要在pivot_table的index参数中提供一个包含年份和半年标识符的列表。年份可以直接通过df.index.year获取。半年的标识符(H1或H2)可以通过判断月份是否小于等于6来生成。这里我们使用numpy.where函数进行条件判断:如果月份小于等于6,则为"H1"(上半年),否则为"H2"(下半年)。

# 使用pivot_table创建按半年间隔分组的数据透视表
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)

输出示例:

        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

从输出可以看出,数据透视表的索引现在是多级的,第一级是年份,第二级是半年标识符(H1或H2),清晰地展示了每个半年内各Vessel的Column1、Column2、Column3的唯一值数量。

将索引转换回日期格式

虽然多级索引在某些情况下很有用,但在进行时间序列分析或可视化时,我们可能更倾向于使用标准的日期索引。我们可以通过遍历当前的年和半年标识符,并根据半年标识符构建对应的日期(例如,H1对应当年1月1日,H2对应当年7月1日),然后将其转换回datetime对象。

# 将数据透视表的索引转换回日期格式
pivot_df.index = [
    pd.to_datetime(f'{year}-{"01-01" if half == "H1" else "07-01"}') # 注意:H2通常从7月1日开始
    for year, half in pivot_df.index
]

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

输出示例:

           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

现在,数据透视表的索引已经变为了标准的日期格式,更便于后续的时间序列操作和分析。

注意事项

  1. 自定义逻辑的灵活性: np.where的条件判断是实现自定义分组的关键。你可以根据具体需求调整条件,例如创建季度、双月、甚至更复杂的时间段分组。
  2. 聚合函数: aggfunc参数可以接受多种聚合函数,如sum、mean、count、min、max,甚至自定义函数。在本例中,我们使用了nunique来计算唯一值的数量。
  3. 缺失值处理: 在数据透视表的结果中可能会出现NaN值,这表示在特定分组和列组合下没有数据。在实际应用中,你可能需要使用fillna()等方法进行缺失值处理。
  4. 索引转换的起始日期: 在将半年索引转换回日期时,H1通常对应1月1日,H2通常对应7月1日。请根据你的业务定义调整这些起始日期。

总结

本文演示了如何使用Pandas pivot_table结合numpy.where和日期时间属性,灵活地创建按半年间隔分组的数据透视表。这种方法不仅解决了按自定义时间间隔聚合数据的需求,还提供了将多级索引转换回标准日期格式的方案,极大地增强了Pandas在时间序列数据分析中的应用能力。掌握这种技巧,将使你在处理复杂时间维度的数据时更加得心应手。

热门AI工具

更多
讯飞智文

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

函子Zion

一款支持AI搭建、可视化编辑和多端发布的全栈无代码开发平台。

Atoms
Atoms Hot

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

豆包大模型

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

SoundView
SoundView Hot

SoundView是一款面向跨境电商的视频翻译、配音和本地化 AI 创作平台。

WorkBuddy

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

Flowith
Flowith Hot

Flowith是一款基于画布和智能体工作流的 AI 协作工作空间。

DeepSeek

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

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

相关专题

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

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

360

2025.12.04

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

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

292

2026.01.31

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

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

931

2026.04.13

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3908

2023.11.20

mysql标识符无效错误怎么解决
mysql标识符无效错误怎么解决

mysql标识符无效错误的解决办法:1、检查标识符是否被其他表或数据库使用;2、检查标识符是否包含特殊字符;3、使用引号包裹标识符;4、使用反引号包裹标识符;5、检查MySQL的配置文件等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

18000

2023.12.04

Python标识符有哪些
Python标识符有哪些

Python标识符有变量标识符、函数标识符、类标识符、模块标识符、下划线开头的标识符、双下划线开头、双下划线结尾的标识符、整型标识符、浮点型标识符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1263

2024.02.23

java标识符合集
java标识符合集

本专题整合了java标识符相关内容,想了解更多详细内容,请阅读下面的文章。

9650

2025.06.11

c++标识符介绍
c++标识符介绍

本专题整合了c++标识符相关内容,阅读专题下面的文章了解更多详细内容。

3842

2025.08.07

Go-Zero API开发使用教程
Go-Zero API开发使用教程

本专题聚焦Go-Zero的API开发,拆解.api描述文件的语法结构、路由与分组定义、参数绑定与校验规则,说明统一响应体、JWT鉴权、跨域与接口文档生成的落地方式,并给出网关聚合与接口测试的实践建议。

20

2026.11.12

热门下载

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

精品课程

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

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