将变量整合为统一时间序列:销售数据时间维度Pivot转换需求
解决方案:宽表转时间序列长表
这个需求其实就是典型的宽表转长表+日期格式转换的问题,用Python的pandas就能轻松搞定,我给你一步步拆解操作:
1. 准备环境与示例数据
首先导入pandas,我们先构造一个和你描述匹配的示例数据集(补全了中间week2-week51的空值):
import pandas as pd # 构造符合你结构的示例数据 data = { 'product': ['A', 'B', 'A'], 'week1': [pd.NA, 200, 60], 'week52': [100, 200, 50], 'year': [2008, 2008, 2009], 'release': ['2008-06-06', '2008-01-01', '2008-06-06'] } # 补全week2到week51的空值 for week in range(2, 52): data[f'week{week}'] = [pd.NA, pd.NA, pd.NA] df = pd.DataFrame(data)
2. 将宽表转为长表(Melt操作)
我们需要把week1到week52这些列“展开”成行,用melt函数实现,保留product、year、release作为标识列:
# 把所有week开头的列转成行,生成周标识和销售额列 melted_df = df.melt( id_vars=['product', 'year', 'release'], value_vars=[col for col in df.columns if col.startswith('week')], var_name='week_label', # 存储原列名(比如week1) value_name='sales' # 存储对应周的销售额 )
3. 提取周数并生成日期
接下来从week_label里提取数字周数,再结合year生成具体的日期。这里默认周的起始日为周一(如果你的周是从周日开始,后面会说明调整方法):
# 从week_label中提取纯数字的周数(比如从"week1"得到1) melted_df['week_number'] = melted_df['week_label'].str.extract('(\d+)').astype(int) # 结合year和week_number生成日期:格式为"年-W周数-周一" melted_df['date'] = pd.to_datetime( melted_df['year'].astype(str) + '-W' + melted_df['week_number'].astype(str).str.zfill(2) + '-1', format='%Y-W%W-%u' )
- 如果你需要周起始日为周日,把格式串里的
%u改成%w即可(%w代表周日为0,周六为6),对应的日期生成代码调整为:melted_df['date'] = pd.to_datetime( melted_df['year'].astype(str) + '-W' + melted_df['week_number'].astype(str).str.zfill(2) + '-0', format='%Y-W%W-%w' )
4. 整理最终数据集
最后去掉不需要的中间列,调整列顺序并按产品和日期排序:
# 转换release列为datetime类型(可选,根据需求决定是否保留字符串格式) melted_df['release'] = pd.to_datetime(melted_df['release']) # 筛选需要的列并排序 final_df = melted_df[['product', 'date', 'release', 'sales']].sort_values(by=['product', 'date'])
执行完这些步骤后,你就得到了和需求一致的时间序列数据集,空值(NA)会被完整保留。
内容的提问来源于stack exchange,提问作者Magean
相关产品推荐
相关产品推荐

