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

如何在含NaT的Pandas DataFrame中按行指定日期区间求列最值

实现方案

要在保留所有行的前提下,对startDate和endDate均非NaT的行计算对应区间内Value1的最值,你可以按以下步骤操作:

1. 校验并转换日期类型

首先确保索引和日期列的类型正确,避免后续切片出错:

import pandas as pd

# 转换索引为DatetimeIndex(如果尚未转换)
df.index = pd.to_datetime(df.index)
# 转换startDate、endDate为datetime类型
df[['startDate', 'endDate']] = df[['startDate', 'endDate']].apply(pd.to_datetime)

2. 编写区间最值计算逻辑

定义一个函数,针对单行数据判断区间有效性,再提取对应范围的Value1最值:

def calc_range_stats(row):
    # 仅处理双日期均非空的行
    if pd.notna(row['startDate']) and pd.notna(row['endDate']):
        # 筛选索引在[startDate, endDate]范围内的行
        interval_mask = (df.index >= row['startDate']) & (df.index <= row['endDate'])
        interval_values = df.loc[interval_mask, 'Value1']
        # 返回最值,用Series指定列名
        return pd.Series([interval_values.max(), interval_values.min()], index=['Value1_Max', 'Value1_Min'])
    # 含NaT的行返回缺失值
    return pd.Series([pd.NA, pd.NA], index=['Value1_Max', 'Value1_Min'])

3. 应用逻辑并合并结果

通过apply逐行处理,将结果合并到原DataFrame:

# 按行应用函数
range_metrics = df.apply(calc_range_stats, axis=1)
# 合并到原数据
df = pd.concat([df, range_metrics], axis=1)

优化提示

如果你的数据集规模很大(比如十万行以上),apply的逐行处理可能速度较慢。这种情况下可以考虑用向量化的区间匹配方式,例如利用numpy的广播生成所有行的区间掩码,再批量计算最值,但实现复杂度会稍高。

内容的提问来源于stack exchange,提问作者tnf

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 17:48:29