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

将变量整合为统一时间序列:销售数据时间维度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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:08:27