
本教程详细介绍了如何使用pandas和numpy创建按半年(上半年h1、下半年h2)间隔聚合的数据透视表。通过结合年份和自定义的半年标识符作为索引,实现灵活的数据分组。文章还演示了如何将生成的多级索引转换为更直观的日期格式,以便于后续分析和可视化。
在数据分析中,我们经常需要对时间序列数据进行聚合,例如按年、按季度或按月。然而,有时业务需求可能需要更灵活的时间间隔,例如按半年(上半年H1:1-6月,下半年H2:7-12月)进行聚合。Pandas的pivot_table函数通常允许我们直接使用dt.year或dt.quarter进行分组,但对于自定义的半年间隔,我们需要更精细的控制。
1. 构建示例数据
首先,我们创建一个包含日期索引和随机数据的DataFrame,并添加一个用于透视的额外列(例如Vessel),以便更好地模拟实际场景。
import pandas as pdimport 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″。
怪兽AI数字人
数字人短视频创作,数字人直播,实时驱动数字人
44 查看详情
Column1 Column2 Column3 Vessel 1 2 3 4 1 2 3 4 1 2 3 42023 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.02024 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 42023-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.02023-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.02024-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)间隔进行数据聚合与索引转换的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/584566.html
微信扫一扫
支付宝扫一扫