如何判断Pandas日期范围差是否为空?批量处理缺失销售日期
解决Pandas多商品周销售数据的缺失日期判断与填充问题
判断缺失日期的正确方式
你不用isnan()来判断,因为pd.date_range().difference()返回的是DatetimeIndex对象,它没有isnan()方法。直接检查这个结果是否为空即可,有两种简洁高效的方式:
- 检查
missing_dates.empty:返回True则说明当前商品无缺失日期 - 检查
len(missing_dates) == 0:效果与上述一致,empty属性性能更优
完整处理代码示例
假设你的数据框df包含product_id(商品标识)、week_date(周日期)、sales(销售额)以及其他商品固定信息(如product_name、category等),完整处理流程如下:
import pandas as pd # 先确保日期列是datetime类型(如果原始数据是字符串格式) df['week_date'] = pd.to_datetime(df['week_date']) # 定义全局完整的周日期范围(按你的需求设置) full_week_dates = pd.date_range(start="2017-01-13", end="2022-12-16", freq="W-SAT") # 初始化列表存放处理后的每个商品数据 processed_groups = [] # 按商品分组遍历处理 for product_id, group_df in df.groupby('product_id'): # 获取当前商品已有的日期集合 existing_dates = group_df['week_date'] # 找出当前商品缺失的周日期 missing_dates = full_week_dates.difference(existing_dates) # 无缺失日期则直接保留原数据,跳过后续处理 if missing_dates.empty: processed_groups.append(group_df) continue # 提取当前商品的固定信息(排除日期和销售额字段) fixed_product_info = group_df.iloc[0].drop(['week_date', 'sales']).to_dict() # 构造缺失日期对应的填充行:销售额设为0,复制商品固定信息 missing_rows = pd.DataFrame({ 'week_date': missing_dates, 'sales': 0, **fixed_product_info # 展开所有固定信息字段 }) # 合并原数据与填充行,按日期排序后重置索引 updated_group = pd.concat([group_df, missing_rows])\ .sort_values('week_date')\ .reset_index(drop=True) processed_groups.append(updated_group) # 合并所有处理后的商品数据,得到最终完整数据框 final_df = pd.concat(processed_groups).reset_index(drop=True)
关键注意事项
- 确认商品“其他信息”的稳定性:同一个
product_id对应的名称、分类等信息需保持固定,这样用iloc[0]提取才准确;若存在随日期变动的字段,需单独调整提取逻辑。 - 用列表收集分组结果再合并:比直接修改原数据框的效率更高,尤其适合数据量较大的场景。
内容的提问来源于stack exchange,提问作者Jordan Howell
相关产品推荐
相关产品推荐

