You need to enable JavaScript to run this app. 如何为按月份分组的时间序列统计数据的缺失月份填充0值
优惠活动
大模型
产品
解决方案
定价
更多

如何为按月份分组的时间序列统计数据的缺失月份填充0值

缺失月份统计记录补全方案

以下是三种常用场景下的实现方法:

方案1:SQL实现(适用于数据库统计场景,以MySQL 8.0+为例)

核心逻辑:先生成统计时间范围内的连续月份序列,与所有待补全的用户维度做笛卡尔积得到全量基准行,再左关联原始统计结果,缺失的Count值用0填充即可。

WITH RECURSIVE month_series AS (
    -- 取统计时间范围的最小月份作为起始
    SELECT MIN(YYYYMM) AS month FROM user_month_count
    UNION ALL
    -- 递归生成下一个月,兼容跨年逻辑
    SELECT 
        CASE WHEN RIGHT(month, 2) = '12' 
             THEN CONCAT(LEFT(month,4) + 1, '01')
             ELSE CONCAT(LEFT(month,4), LPAD(RIGHT(month,2) + 1, 2, '0'))
        END AS month
    FROM month_series
    WHERE month < (SELECT MAX(YYYYMM) FROM user_month_count)
),
user_list AS (
    -- 提取所有需要补全的用户唯一维度
    SELECT DISTINCT FirstName, LstName FROM user_month_count
)
SELECT 
    ul.FirstName,
    ul.LstName,
    ms.month AS YYYYMM,
    COALESCE(umc.Count, 0) AS Count
FROM user_list ul
CROSS JOIN month_series ms
LEFT JOIN user_month_count umc
    ON ul.FirstName = umc.FirstName 
    AND ul.LstName = umc.LstName 
    AND ms.month = umc.YYYYMM
ORDER BY ul.FirstName, ul.LstName, ms.month;

注:若使用不支持递归CTE的数据库版本,可预先构建一张存储所有连续月份的维度表替换上述month_series即可。

方案2:Python Pandas实现(适用于本地数据处理场景)

核心逻辑:将月份字段转为时间格式,按用户分组后对时间维度按月重采样生成连续月份,空值补0后再转回YYYYMM格式。

import pandas as pd

# 原始统计数据构造示例
df = pd.DataFrame([
    ['Angeline', 'Boyd', '201709', 2],
    ['Angeline', 'Boyd', '201712', 7],
    ['Angeline', 'Boyd', '201801', 7],
    ['Angeline', 'Boyd', '201802', 9]
], columns=['FirstName', 'LstName', 'YYYYMM', 'Count'])

# 转换为时间格式用于重采样
df['month'] = pd.to_datetime(df['YYYYMM'], format='%Y%m')

# 按用户分组后按月重采样补全缺失月份
result = df.groupby(['FirstName', 'LstName'], group_keys=False)\
           .apply(lambda x: x.set_index('month').resample('M').asfreq())\
           .reset_index()

# 补全空值、还原YYYYMM格式
result['YYYYMM'] = result['month'].dt.strftime('%Y%m')
result[['FirstName', 'LstName']] = result[['FirstName', 'LstName']].ffill()
result['Count'] = result['Count'].fillna(0).astype(int)

# 输出目标列
result = result[['FirstName', 'LstName', 'YYYYMM', 'Count']]

方案3:Excel实现(适用于小批量手工处理场景)

  • 先提取所有不重复的用户组合(FirstName + LstName)
  • 生成统计时间范围内的连续YYYYMM序列,和用户组合交叉填充得到全量基准行
  • 用XLOOKUP或VLOOKUP函数匹配原始统计表的Count值,匹配不到的返回0即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 18:45:03