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

如何筛选Pandas DataFrame中72小时后仍存在的热带气旋记录

解决热带气旋72小时存续性判断问题

原代码问题分析

你写的代码逻辑存在明显错误:

  • deck['BASIN'] == deck['BASIN']和CY == CY是恒成立的无效条件,完全多余;
  • deck['YYYYMMDDHH'] == (deck['YYYYMMDDHH'] + datetime.timedelta(hours=72))是拿每行时间和自身加72小时对比,结果全为False;
  • 外层的len(...)>0是判断整个布尔系列的长度是否大于0,最终得到单一布尔值,无法作为逐行索引的条件。

正确实现方案

核心思路是按每个独立风暴(BASIN+CY分组),检查当前记录的时间点加72小时后,该风暴是否还有观测记录,用Pandas的分组+transform可以高效完成,无需逐行循环:

  1. 确保时间列是datetime类型
    如果你的YYYYMMDDHH列还不是datetime格式,先做转换:
import pandas as pd
deck['YYYYMMDDHH'] = pd.to_datetime(deck['YYYYMMDDHH'], format='%Y%m%d%H')
  1. 分组判断72小时后是否存在记录
    定义分组处理函数,把每个风暴的时间转成集合提升查找效率:
def check_72h_exist(group):
    time_collection = set(group['YYYYMMDDHH'])
    return group['YYYYMMDDHH'].apply(lambda t: (t + pd.Timedelta(hours=72)) in time_collection)

# 按海域+风暴编号分组,生成每行的布尔标记
deck['storm_exists_after_72h'] = deck.groupby(['BASIN', 'CY'])['YYYYMMDDHH'].transform(check_72h_exist)
  1. 筛选目标行
    直接用布尔列筛选出符合条件的记录:
target_records = deck[deck['storm_exists_after_72h']]

优化说明

将时间转成集合后,查找操作的时间复杂度从O(n)降至O(1),数据量较大时能显著提升运行效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:56:10