在同一DataFrame中查找多日期列的日期重叠范围
筛选多列日期DataFrame的共享日期数据
场景1:DataFrame索引为日期,v1-v10为对应指标列
这是最常见的场景——将10个数据源按日期索引合并后,v1-v10列在部分日期存在缺失值,需要找出所有列都有有效数据的日期,并保留这些日期的完整数据:
import pandas as pd # 假设目标DataFrame名为df,索引为datetime类型 # 1. 提取每列非空数据对应的日期集合 column_date_sets = [set(df[col].dropna().index) for col in df.columns if col.startswith('v')] # 2. 计算所有列日期的交集(即所有列都覆盖到的日期) shared_dates = set.intersection(*column_date_sets) # 3. 将交集转为有序的DatetimeIndex,保证日期顺序正确 sorted_shared_dates = pd.DatetimeIndex(sorted(shared_dates)) # 4. 筛选原DataFrame,只保留共享日期的行 result_df = df.loc[sorted_shared_dates]
场景2:v1-v10本身是日期列(每行存储不同数据源的日期值)
如果v1-v10列直接存储日期值,需要找出所有列中都出现过的日期值,并保留符合要求的行:
import pandas as pd # 假设df的v1-v10列是datetime类型 # 1. 收集每列的日期值集合(去重+排除空值) date_sets = [set(df[col].dropna()) for col in df.columns if col.startswith('v')] # 2. 计算所有列的日期交集 shared_dates = set.intersection(*date_sets) # 筛选所有列的日期都属于共享集合的行 result_df = df[df.apply(lambda row: all(date in shared_dates for date in row), axis=1)]
补充:获取连续的共享日期范围
如果需要的是连续的共享日期区间而非离散日期,可以在得到排序后的共享日期后,提取最长连续区间:
if len(sorted_shared_dates) > 0: # 计算日期差,找出连续区间的分界点 date_diff = sorted_shared_dates[1:] - sorted_shared_dates[:-1] split_points = date_diff != pd.Timedelta(days=1) # 拆分所有连续区间 continuous_ranges = [] start_idx = 0 for idx, is_split in enumerate(split_points, 1): if is_split: continuous_ranges.append(sorted_shared_dates[start_idx:idx]) start_idx = idx continuous_ranges.append(sorted_shared_dates[start_idx:]) # 筛选最长的连续日期区间 longest_range = max(continuous_ranges, key=len) result_df = df.loc[longest_range]
内容的提问来源于stack exchange,提问作者Eizy
相关产品推荐
相关产品推荐

