如何筛选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可以高效完成,无需逐行循环:
- 确保时间列是datetime类型
如果你的YYYYMMDDHH列还不是datetime格式,先做转换:
import pandas as pd deck['YYYYMMDDHH'] = pd.to_datetime(deck['YYYYMMDDHH'], format='%Y%m%d%H')
- 分组判断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)
- 筛选目标行
直接用布尔列筛选出符合条件的记录:
target_records = deck[deck['storm_exists_after_72h']]
优化说明
将时间转成集合后,查找操作的时间复杂度从O(n)降至O(1),数据量较大时能显著提升运行效率。
内容的提问来源于stack exchange,提问作者SlushP22
相关产品推荐
相关产品推荐

