如何使用pandas筛选拥有指定完整时间段数据的个体?
筛选指定时间段内有完整数据的个体
实现思路
你需要的不是单纯筛选时间段内的行,而是要确保每个个体的日期集合完全覆盖指定时间段的所有日期,同时排除那些起始日期晚于目标起始点、或结束日期早于目标结束点的个体。具体分以下几步操作:
代码实现
1. 导入库并处理原数据
首先将日期列转换为datetime类型(字符串无法正确进行日期比较和集合操作):
import pandas as pd # 原数据集 df = pd.DataFrame({'names':['jim','jim','jim','jim','jim','jim','jim','jim','jim','jim', 'bob','bob','bob','bob','bob','bob', 'sara','sara','sara','sara','sara','sara','sara','sara','sara','sara'], 'dates':['01-01-19','01-02-19','01-03-19','01-04-19','01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19', '01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19', '01-01-19','01-02-19','01-03-19','01-04-19','01-05-19','01-06-19','01-07-19','01-08-19','01-09-19','01-10-19']}) # 转换日期格式为datetime(原格式是DD-MM-YY) df['dates'] = pd.to_datetime(df['dates'], format='%d-%m-%y')
2. 定义目标时间段并生成完整日期范围
明确你要筛选的时间段,同时生成该时间段内的所有日期(作为“完整数据”的参照):
# 目标时间段的起始和结束日期 start_date = pd.to_datetime('2019-01-01') end_date = pd.to_datetime('2019-01-10') # 生成时间段内的所有日期(共10天) full_date_range = pd.date_range(start=start_date, end=end_date)
3. 筛选符合条件的个体
按names分组,检查每个个体的日期集合是否包含完整的目标日期范围,再提取这些个体的所有数据:
# 筛选出日期覆盖完整时间段的个体 valid_names = df.groupby('names')['dates'].apply( lambda x: set(full_date_range).issubset(set(x)) ) # 获取最终筛选后的数据集 filtered_df = df[df['names'].isin(valid_names[valid_names].index)]
关键说明
- 你提到的
df[(df['dates'] >= "2019-01-01")&(df['dates'] <= "2019-01-10")]只能筛选出时间段内的行,但无法保证个体有完整的每日数据(比如bob的行都在该时间段内,但缺少前4天的数据)。 - 如果需要严格保证每个个体每天恰好有一条数据(排除重复日期的情况),可以修改分组判断条件:
valid_names = df.groupby('names')['dates'].apply( lambda x: len(set(x)) == len(full_date_range) and set(full_date_range).issubset(set(x)) )
内容的提问来源于stack exchange,提问作者John Conor
相关产品推荐
相关产品推荐

