
本教程详细介绍了如何使用pandas和numpy创建按半年(上半年h1、下半年h2)间隔聚合的数据透视表。通过结合年份和自定义的半年标识符作为索引,实现灵活的数据分组。文章还演示了如何将生成的多级索引转换为更直观的日期格式,以便于后续分析和可视化。
在数据分析中,我们经常需要对时间序列数据进行聚合,例如按年、按季度或按月。然而,有时业务需求可能需要更灵活的时间间隔,例如按半年(上半年H1:1-6月,下半年H2:7-12月)进行聚合。Pandas的pivot_table函数通常允许我们直接使用dt.year或dt.quarter进行分组,但对于自定义的半年间隔,我们需要更精细的控制。
首先,我们创建一个包含日期索引和随机数据的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())实现半年间隔聚合的关键在于为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)上述代码中:
输出结果将是一个多级索引的DataFrame,其中第一级索引是年份,第二级索引是"H1"或"H2"。
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为了方便后续的时间序列分析或可视化,我们可能需要将这种年-半年的多级索引转换为标准的日期格式。例如,将"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
通过结合Pandas的pivot_table功能与NumPy的条件逻辑,我们可以轻松实现按自定义半年间隔进行数据聚合的需求。这种方法不仅提供了强大的数据分组能力,而且通过后续的索引转换,使得处理结果更具可读性和实用性。掌握这种技巧,将有助于您在复杂时间序列数据分析中更加灵活高效。
以上就是Pandas数据透视表:按半年(H1/H2)间隔进行数据聚合与索引转换的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号