Python如何将含分类、数值列的日度数据转换为周/月度数据
Python实现日度数据转周/月度聚合方案
适用场景:
- 数据集包含日期列、分类列、数值列三类字段
- 同一聚合周期(周/月)内同维度的分类列取值基本固定
- 聚合需求:按时间维度聚合后保留分类列原值,数值列执行求和计算

实现步骤
核心逻辑:用pandas的resample方法做时间维度聚合,对取值固定的分类列取组内第一个值即可,不需要额外做复杂映射,数值列直接求和。
- 预处理时间字段
首先导入pandas库,读取数据后将日期列转换为标准时间格式,这是时间聚合的必要前提:
import pandas as pd # 替换为你的数据读取逻辑,支持csv、excel等格式 df = pd.read_csv("your_daily_data_path.csv") # 替换date_col为你数据集中实际的日期列名 df["date_col"] = pd.to_datetime(df["date_col"])
- 配置聚合规则
两种配置方式可选,根据自己的数据集情况选就行:
- 手动指定列规则(适合列数少、字段明确的场景)
# 以下列名替换为你数据集的实际字段名 agg_config = { "category_a": "first", # 分类列取组内第一个值,同组值一致时结果准确 "category_b": "first", "sales": "sum", # 数值列求和 "visitor": "sum" } # 月度聚合,M代表按自然月(月末为统计节点)聚合 df_monthly = df.set_index("date_col").resample("M").agg(agg_config).reset_index() # 周度聚合只要把resample的参数换成W即可,默认周日为周起始 # df_weekly = df.set_index("date_col").resample("W").agg(agg_config).reset_index()
- 自动识别列类型生成规则(适合列数多、不想手动配置的场景)
agg_config = {} for col in df.columns: if col == "date_col": # 跳过日期列 continue # 识别分类/文本类型列,取组内第一个值 if pd.api.types.is_object_dtype(df[col]) or pd.api.types.is_categorical_dtype(df[col]): agg_config[col] = "first" # 识别数值类型列,执行求和 elif pd.api.types.is_numeric_dtype(df[col]): agg_config[col] = "sum" # 执行月度聚合 df_monthly = df.set_index("date_col").resample("M").agg(agg_config).reset_index()
注意事项
- 如果担心个别日期的分类列存在异常值、同组取值不完全一致,可以把分类列的聚合规则从
first换成lambda x: x.mode()[0],取组内众数,容错性更高 - 可以根据业务需求调整resample的时间频率参数:
MS代表按月初为节点聚合,W-MON代表按周一为周起始聚合 - 聚合完成后可以根据需要把日期列格式化为
%Y-%m的月度字符串格式,方便后续匹配其他数据
内容的提问来源于stack exchange,提问作者Bad Coder
相关产品推荐
相关产品推荐

