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

基于日期区间统计时序数据:Pandas空DataFrame添加行问题求助

解决DataFrame日期区间统计的问题

我来帮你梳理下当前代码里的问题,然后给出更高效可靠的解决方案:

原代码的核心问题

  1. 空DataFrame赋值错误:你创建的outputtable是空的,用outputtable[-1]去赋值会直接报错,因为不存在第-1行的索引。
  2. 宽泛的异常捕获:try...except捕获所有异常,会掩盖比如日期格式不匹配这类真正的问题,不利于调试。
  3. 循环效率低:手动遍历索引的写法不符合Pandas的设计风格,大数据量下会很慢。

优化后的解决方案

第一步:确保日期格式正确

首先要保证所有日期列都是datetime类型,避免切片失效:

# 转换df1的日期列为datetime格式
df1['Start Date'] = pd.to_datetime(df1['Start Date'])
df1['End Date'] = pd.to_datetime(df1['End Date'])

# 确认df2的索引是datetime类型(你说已经设为索引,这里再加固下)
df2.index = pd.to_datetime(df2.index)

第二步:编写统计函数并批量处理

用apply代替循环,既简洁又高效,同时明确处理空区间的情况:

def calculate_interval_stats(row):
    start_date = row['Start Date']
    end_date = row['End Date']
    
    # 筛选出df2中在当前区间内的数据
    interval_data = df2.loc[(df2.index >= start_date) & (df2.index <= end_date)]
    
    # 如果区间内没有数据,返回空值
    if interval_data.empty:
        return pd.Series([None, None, None], index=['Min', 'Max', 'Ave'])
    
    # 计算统计值
    min_val = interval_data['Value'].min()
    max_val = interval_data['Value'].max()
    avg_val = interval_data['Value'].mean()
    
    return pd.Series([min_val, max_val, avg_val], index=['Min', 'Max', 'Ave'])

# 对df1的每一行应用统计函数
stats_results = df1.apply(calculate_interval_stats, axis=1)

# 合并原df1和统计结果,得到你想要的格式
outputtable = pd.concat([df1, stats_results], axis=1)

为什么这样更好?

  • 保留原日期列:直接和df1合并,自动带上Start Date和End Date,完全符合你期望的输出格式。
  • 明确处理空区间:主动检查切片是否为空,代替模糊的异常捕获,避免隐藏其他问题。
  • Pandas原生效率:apply比手动循环更高效,尤其是数据量大的时候优势明显。

额外提示

如果你的df2数据量特别大,可以考虑用pd.cut或者区间索引来优化性能,但上面的写法已经能覆盖大部分场景啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:48:17