如何用Python函数结合Pandas DataFrame查找缺失日期数据
问题描述
我有一个Pandas DataFrame,需要编写函数返回过去3天内该DataFrame中未记录的日期与对应姓名。
示例DataFrame(df1)如下:
| date | name |
|---|---|
| 2022-08-05 | Alex |
| 2022-08-07 | Alex |
我尝试编写了如下checker函数:
def checker (table, name): if len(table[table.names == name]) == 3: msg = '\n All good' else: name_list = [*table['name'].unique()] msg = '\n No data for:' for name in name_list: msg += f'\n {name}' return msg
请问如何在返回信息中添加缺失的日期?或者是否可以优化该函数?我需要的输出格式为包含缺失日期与姓名的信息,例如:
2022-08-06 Alex
优化解决方案
实现思路
要精准找出目标日期范围内的缺失记录,核心步骤是:
- 标准化日期格式,确保能进行日期运算
- 生成目标时间范围内的完整日期序列
- 为每个姓名生成该范围内的所有预期记录组合
- 对比原DataFrame,筛选出不存在的组合
完整代码
import pandas as pd from datetime import timedelta def checker(table, target_name=None): # 转换日期列为datetime类型,避免字符串格式冲突 table['date'] = pd.to_datetime(table['date']) # 生成过去3天的连续日期序列(以数据中最晚日期为基准往前推2天) max_date = table['date'].max() date_range = pd.date_range(start=max_date - timedelta(days=2), end=max_date) # 确定要检查的姓名:支持指定单个或检查所有唯一姓名 names_to_check = [target_name] if target_name else table['name'].unique() missing_records = [] for name in names_to_check: # 生成该姓名在目标日期范围内的所有预期记录 expected = pd.DataFrame({'date': date_range, 'name': name}) # 找出原表中不存在的记录 missing = expected[~expected.set_index(['date', 'name']).index.isin(table.set_index(['date', 'name']).index)] # 转换为要求的字符串格式并收集 for _, row in missing.iterrows(): missing_records.append(f"{row['date'].strftime('%Y-%m-%d')} {row['name']}") # 返回结果 return '\n'.join(missing_records) if missing_records else "All good" # 测试示例 df1 = pd.DataFrame({ 'date': ['2022-08-05', '2022-08-07'], 'name': ['Alex', 'Alex'] }) print(checker(df1))
代码说明
- 日期兼容:自动转换
date列为datetime类型,适配各种日期字符串格式 - 灵活范围:基于数据中的最晚日期生成连续3天,无需手动指定时间范围
- 精准匹配:通过索引对比快速找出缺失记录,比逐行遍历更高效
- 多场景支持:可指定单个姓名检查,也能批量检查所有姓名的缺失情况
测试输出
运行代码后,输出符合需求:
2022-08-06 Alex
内容的提问来源于stack exchange,提问作者Kurasao
相关产品推荐
相关产品推荐

