Power Query技术问询:如何用前一日行数据填充空值
用前一日数据填充空值的解决方案
不用按日期分组——分组会把每天的数据拆成独立组,反而没法跨日期取数。下面是两种常用工具的具体实现:
方法1:Python Pandas
适合批量处理本地数据,核心用ffill()(向前填充)函数自动取上一行非空值填充当前空值,前提是数据按日期排序:
import pandas as pd # 1. 读取数据(以CSV为例) df = pd.read_csv('your_data.csv') # 2. 确保日期列是datetime格式,避免排序出错 df['日期'] = pd.to_datetime(df['日期']) # 3. 按日期升序排序(关键!必须保证数据按时间顺序排列) df = df.sort_values('日期') # 4. 向前填充空值 # 如果有分组维度(比如不同产品/门店),改成 df.groupby('分组列').ffill() df_filled = df.ffill() # 5. 保存结果 df_filled.to_csv('filled_data.csv', index=False)
输入数据里的空值会自动取前一天同列的非空值填充,和你要的输出效果一致。
方法2:SQL
适合数据库内直接处理,根据不同数据库语法调整:
PostgreSQL/Redshift等支持IGNORE NULLS的数据库
用LAST_VALUE窗口函数,直接取当前行之前的最后一个非空值:
SELECT 日期, LAST_VALUE(销售额 IGNORE NULLS) OVER (ORDER BY 日期 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 销售额, LAST_VALUE(访客数 IGNORE NULLS) OVER (ORDER BY 日期 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 访客数 FROM your_table ORDER BY 日期;
如果有分组维度(比如产品),在OVER里加PARTITION BY 产品列即可。
MySQL 8.0+
MySQL不支持IGNORE NULLS,可以用自定义变量+COALESCE实现:
SELECT 日期, @sales := COALESCE(销售额, @sales) AS 销售额, @visitors := COALESCE(访客数, @visitors) AS 访客数 FROM your_table, (SELECT @sales := NULL, @visitors := NULL) AS init_vars ORDER BY 日期;
内容的提问来源于stack exchange,提问作者Bantai
相关产品推荐
相关产品推荐

