如何通过循环创建不同命名的月度筛选列表并统计分析
修正按月份筛选DataFrame并生成对应数据集的代码
原代码的问题分析
- 循环未使用迭代变量,始终依赖固定值
times=12,导致每次循环都只筛选12月的数据 - 日期处理重复冗余,同时操作
data和df两个对象,完全没必要 - 条件判断
if times <=9逻辑失效,times固定为12,永远不会进入分支 - 未持久化每个月份的筛选结果,每次循环都会覆盖
month变量
修正后的代码实现
推荐用字典存储各月份的数据集(比直接创建1、2...这类变量更易维护和遍历):
import pandas as pd # 读取并预处理数据 excel_path = 'short data.xlsx' df = pd.read_excel(excel_path, parse_dates=['Closed Date Time']) # 提取日期部分(去掉时间),直接在df上操作即可 df['Close_Date'] = df['Closed Date Time'].dt.normalize() # 等价于dt.date转datetime,更简洁 # 按月份分组存储,key是月份数字,value是对应月份的DataFrame monthly_dfs = {} for month_num in range(1, 13): # 格式化月份字符串,1-9月自动补0 month_str = f'2018-{month_num:02d}' # 筛选对应月份的数据 monthly_dfs[month_num] = df[df['Close_Date'].dt.strftime('%Y-%m') == month_str] # 如果一定要创建名为1、2...12的变量(不推荐,字典更规范),可以用globals() # for month_num in range(1, 13): # month_str = f'2018-{month_num:02d}' # globals()[str(month_num)] = df[df['Close_Date'].dt.strftime('%Y-%m') == month_str]
遍历计算平均值与元素长度
基于字典的遍历方式更清晰,还能避免空数据集报错:
for month_num, month_df in monthly_dfs.items(): # 计算数据行数(元素长度) row_count = len(month_df) # 计算目标数值列的平均值,替换成你实际需要计算的列名 avg_value = month_df['目标数值列'].mean() if row_count > 0 else 0 print(f"月份{month_num}: 数据行数={row_count}, 平均值={avg_value:.2f}")
补充说明
- 用
dt.normalize()替代原有的dt.date转datetime操作,代码更简洁高效 - 字典是Python中管理多个同类型数据集的标准方式,比动态创建变量更易维护,避免命名混乱
- 加入空数据集判断,防止计算平均值时出现
NaN或报错
内容的提问来源于stack exchange,提问作者Keyt Weyner
相关产品推荐
相关产品推荐

