You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

周数据转日数据:数值型字段按7拆分实现方案问询

周度转日度数据:数值型字段均分填充解决方案

问题描述

需要将包含数值型、分类型字段的周度数据转换为日度数据,分类字段已实现正确填充,但数值型字段需将每周数值均分为7份,填充到对应7天中,原代码中agg_dict里数值字段的处理逻辑(当前用"mean")无法实现该需求。

解决方案

核心思路是先按日重采样并向前填充所有字段,再对数值型字段统一除以7,这种方式比在agg_dict中编写复杂lambda函数更简洁高效。

修改后的完整代码:

import pandas as pd

# 创建示例数据
data = {'Date': ['2015-01-25', '2015-02-01', '2015-02-08', '2015-02-15', '2015-02-22'],
        'AveragePrice': [1.06, 0.99, 0.99, 1.06, 1.13],
        'Total Volume': [45147.50, 70873.60, 51253.97, 41567.62, 45675.05],
        '4046': [941.38, 1353.90, 1357.37, 986.66, 1088.38],
        '4225': [33196.16, 60017.20, 39111.81, 30045.51, 35056.13],
        '4770': [164.14, 179.32, 163.25, 222.42, 151.00],
        'Total Bags': [10845.82, 9323.18, 10621.54, 10313.03, 9379.54],
        'Small Bags': [10103.35, 9170.82, 10113.10, 9979.87, 9000.16],
        'Large Bags': [742.47, 152.36, 508.44, 333.16, 379.38],
        'XLarge Bags': [0.00, 0.00, 0.00, 0.00, 0.00],
        'type': ['conventional', 'conventional', 'conventional', 'conventional', 'conventional'],
        'year': [2015, 2015, 2015, 2015, 2015],
        'region': ['Albany', 'Albany', 'Albany', 'Albany', 'Albany'],
        'AveragePrice Lag1': [1.17, 1.06, 0.99, 0.99, 1.06],
        'AveragePrice Lag2': [1.24, 1.17, 1.06, 0.99, 0.99],
        'AveragePrice Lag3': [1.22, 1.24, 1.17, 1.06, 0.99],
        'Total Volume Lag1': [44511.28, 45147.50, 70873.60, 51253.97, 41567.62],
        'Total Volume Lag2': [41195.08, 44511.28, 45147.50, 70873.60, 51253.97],
        'Total Volume Lag3': [40873.28, 41195.08, 44511.28, 45147.50, 70873.60]}

# 构建DataFrame
dataframe = pd.DataFrame(data)
dataframe['Date'] = pd.to_datetime(dataframe['Date'])
dataframe['type'] = dataframe['type'].astype('category')
dataframe['region'] = dataframe['region'].astype('category')

def _check_for_numerical_columns(dataframe):
    """筛选所有数值型字段"""
    dtypes = dataframe.dtypes
    cols_list = []
    for col in dataframe.columns:
        if pd.api.types.is_float_dtype(dtypes[col]):
            cols_list.append(col)
    return cols_list

def _check_for_categorical_columns(dataframe):
    """筛选所有分类型字段"""
    dtypes = dataframe.dtypes
    cols_list = []
    for col in dataframe.columns:
        if pd.api.types.is_categorical_dtype(dtypes[col]):
            cols_list.append(col)
    return cols_list

cat_cols = _check_for_categorical_columns(dataframe)
num_cols = _check_for_numerical_columns(dataframe)

# 步骤1:按日重采样,向前填充7天(分类字段保留原类别,数值字段保留每周原值)
aggr_dataframe = dataframe.resample('D', on="Date").ffill(limit=7)

# 步骤2:对数值型字段执行均分操作(除以7)
aggr_dataframe[num_cols] = aggr_dataframe[num_cols] / 7

print(aggr_dataframe)

关键修改说明

  • 替换聚合逻辑:放弃resample.apply的复杂聚合写法,改用ffill(limit=7)直接向前填充7天,确保每周的数值和分类值覆盖对应日期区间。
  • 数值均分处理:单独对数值型字段执行除以7的操作,逻辑清晰且避免了聚合函数的局限性。
  • 类型检查优化:将原代码中硬判断dtypes[col] == 'float'改为pd.api.types.is_float_dtype,兼容更多float类型(如float32、float64),提升代码健壮性。

内容的提问来源于stack exchange,提问作者Shax Studio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 21:37:54