如何将时间序列DataFrame按年拆分赋值到数组并计算总和、最大值等指标
实现方案
1 直接实现列表存储拆分后的DataFrame
你需要的period[i]写法可以通过初始化空列表、循环追加结果实现,优先推荐用pandas内置的时间属性简化逻辑,不需要手动拼接起止时间:
import pandas as pd # 第一步先确保时间列转为datetime格式,这是所有时间操作的基础 df['Time_series'] = pd.to_datetime(df['Time_series']) year_list = [2016,2017,2018,2019,2020] period = [] # 初始化空列表 for y in year_list: # 直接用dt.year筛选对应年份的数据 year_df = df.loc[df['Time_series'].dt.year == y] period.append(year_df) # 后续访问规则:period[0]对应2016年数据,period[1]对应2017年数据,以此类推
如果需要更方便的按年份直接取数,也可以用字典存储:
period_dict = {} for y in year_list: period_dict[y] = df.loc[df['Time_series'].dt.year == y] # 访问示例:period_dict[2019] 直接获取2019年的DataFrame
如果你的场景需要严格按起止时间筛选(比如存在不属于自然年的特殊周期),可以沿用你原来的起止时间逻辑,修改如下即可:
year_list = [2016,2017,2018,2019,2020] period = [] for y in year_list: start = f"{y}-01-01 00:00:00" end = f"{y+1}-01-01 00:00:00" period_df = df.loc[(df['Time_series'] >= start) & (df['Time_series'] < end)] period.append(period_df)
2 更高效的分组统计方案(适配后续指标计算需求)
如果你拆分数据的核心目的是计算年度总和、最大值等指标,不需要单独拆分存储每个年份的DataFrame,直接用groupby分组聚合即可,性能更高、代码更简洁:
# 假设你要统计的数值列名为value,可自行替换 year_stats = df.groupby(df['Time_series'].dt.year).agg( 年度总和=('value', 'sum'), 年度最大值=('value', 'max'), 最大值出现时间=('value', lambda x: df.loc[x.idxmax(), 'Time_series']) ).reset_index() # 输出结果是一个汇总所有年度指标的DataFrame,每行对应一个年份的统计结果
补充说明
- 如果你需要覆盖所有指定年份(哪怕某年份没有数据也保留空的DataFrame),推荐用手动指定年份、循环筛选的方案;如果只需处理有数据的年份,直接用
groupby自动分组即可。 - 如果数据量特别大,优先用分组聚合方案,避免生成大量冗余的DataFrame占用内存。
内容的提问来源于stack exchange,提问作者Anders Schjølberg
相关产品推荐
相关产品推荐

