如何为按月份分组的时间序列统计数据的缺失月份填充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
相关产品推荐
相关产品推荐

