周数据转日数据:数值型字段按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
相关产品推荐
相关产品推荐

