Pandas如何按月份对DateTime数据分组并生成各月份独立DataFrame
按月份拆分独立DataFrame的实现方案
你当前生成的分组对象a已经完成了数据的维度拆分,只需要补充遍历提取每个分组的逻辑,就能得到对应月份的独立DataFrame,不需要额外改造原有分组逻辑。
具体实现步骤
1. 沿用你原有代码的改造方式
你写的分组逻辑本身没有错误,只需要在分组完成后遍历每个分组,把对应子集保存下来即可,示例代码如下:
import pandas as pd # pf为原始加载的数据集 pf.index = pd.to_datetime(pf['DateTime']) # 给分组键加命名,避免后续遍历的时候读不懂分组维度 a = pf.groupby(by=[pf.index.year.rename("year"), pf.index.month.rename("month")]) # 用字典存储拆分后的月份DataFrame,比硬编码df1、df2更灵活 month_df_map = {} for (year, month), single_month_df in a: # 拼接成标准月份标识,比如2012-05 month_key = f"{year}-{str(month).zfill(2)}" # 把索引重置为默认数字索引,和你示例的输出格式对齐 month_df_map[month_key] = single_month_df.reset_index(drop=True)
2. 更简洁的pandas官方推荐写法
比起手动提取年、月作为分组键,可以直接用pd.Grouper指定按月频率分组,代码更简洁也不容易踩跨年份的坑:
# 先把DateTime列转换为时间格式 pf["DateTime"] = pd.to_datetime(pf["DateTime"]) # 直接按DateTime列的月维度分组 grouped = pf.groupby(pd.Grouper(key="DateTime", freq="M")) month_df_map = {} for month_end_time, single_month_df in grouped: # 跳过没有数据的空分组 if len(single_month_df) == 0: continue # 生成月份标识作为字典键 month_key = month_end_time.strftime("%Y-%m") month_df_map[month_key] = single_month_df.reset_index(drop=True)
获取目标月份的DataFrame
完成上述拆分后,直接通过字典键取值即可得到你需要的独立DataFrame:
- 2012年5月的数据:
df1 = month_df_map["2012-05"],输出内容和你示例的5月销售记录完全一致 - 2012年6月的数据:
df2 = month_df_map["2012-06"],输出内容和你示例的6月销售记录完全一致
注意事项
- 不推荐硬编码将每个分组赋值给df1、df2这类固定变量,后续新增月份数据时需要频繁修改代码,还容易因为分组数量变化触发索引错误
- 用分组字典存储的方式可以适配任意数量的月份分组,不需要手动调整变量定义
内容的提问来源于stack exchange,提问作者zsh_18
相关产品推荐
相关产品推荐

