Python:按年份对DataFrame行数值求和的高效Pythonic实现
问题描述
我有一个包含两个datetime列和一个数值列的DataFrame,示例数据如下:
2019-01-01 00:00:00 2019-12-31 00:00:00 118433.0 2020-01-01 00:00:00 2020-12-31 00:00:00 120087.0 2021-01-01 00:00:00 2021-06-30 00:00:00 63831.0 2021-07-01 00:00:00 2021-12-31 00:00:00 63089.0 2022-01-01 00:00:00 2022-06-30 00:00:00 60753.0 2022-07-08 00:00:00 2022-11-30 00:00:00 9067.17
可以看到2019和2020年为完整年度,其余行对应不同时间区间,且每一行的起止日期均属于同一年份。需要按年份对数值列求和,得到如下结果:
2019 118422.0 2020 120087.0 2021 123842.0 2022 9067.0
要求避免简单循环,采用Pythonic的向量化/列表推导式实现。
解决方案
利用Pandas的向量化操作可高效完成需求,步骤如下:
转换日期类型并提取年份
先将datetime列转为Pandas的datetime类型,再提取年份(因每行起止日期同一年,取任意一列提取即可):import pandas as pd # 假设DataFrame列名为'start_date'、'end_date'、'value' df['start_date'] = pd.to_datetime(df['start_date']) df['year'] = df['start_date'].dt.year按年份分组求和
使用groupby结合sum完成分组计算,再按要求格式输出:# 分组求和并保留整数位 year_total = df.groupby('year')['value'].sum().round(0) # 输出结果 for year, total in year_total.items(): print(f"{year} {total}")完整可运行代码
import pandas as pd # 构造示例DataFrame data = [ ('2019-01-01 00:00:00', '2019-12-31 00:00:00', 118433.0), ('2020-01-01 00:00:00', '2020-12-31 00:00:00', 120087.0), ('2021-01-01 00:00:00', '2021-06-30 00:00:00', 63831.0), ('2021-07-01 00:00:00', '2021-12-31 00:00:00', 63089.0), ('2022-01-01 00:00:00', '2022-06-30 00:00:00', 60753.0), ('2022-07-08 00:00:00', '2022-11-30 00:00:00', 9067.17) ] df = pd.DataFrame(data, columns=['start_date', 'end_date', 'value']) # 日期转换与年份提取 df['start_date'] = pd.to_datetime(df['start_date']) df['year'] = df['start_date'].dt.year # 分组求和并输出 year_total = df.groupby('year')['value'].sum().round(0) for year, total in year_total.items(): print(f"{year} {total}")注:你给出的示例结果中2022年数值为9067.0,实际计算应为60753.0+9067.17≈69820.0,推测是示例笔误。
内容的提问来源于stack exchange,提问作者Robert Alexander
相关产品推荐
相关产品推荐

