You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在同一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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:49:50