pandas逐小时气象数据按天重采样时保留最大风速对应风向的方法
问题原因
你之前的代码是对windSpeedHigh和windSpeedHigh_Dir两列分别独立执行max()聚合:风速列取数值最大值符合预期,但风向列是按字符串字典序计算最大值,和当日最大风速没有关联,因此会出现匹配错误。
解决方案
方案1:用idxmax提取最大风速对应行(效率更高)
通过idxmax先定位每日最大风速对应的行索引,再提取对应行的风向和风速数据,最后补全无观测数据的日期:
import pandas as pd # 原始数据预处理 df = pd.DataFrame({ 'date': ['2019-01-01 09:30:00', '2019-01-01 10:00', '2019-01-02 04:30:00','2019-01-02 05:00:00','2019-07-04 02:00:00'], 'windSpeedHigh': [155,90,35,45,15], 'windSpeedHigh_Dir':['NE','NNW','SW','W','S'] }) df['date'] = pd.to_datetime(df['date']) df['windSpeedHigh'] = pd.to_numeric(df['windSpeedHigh']) # 1. 取每日最大风速对应的行索引 max_speed_idx = df.resample('D', on='date')['windSpeedHigh'].idxmax() # 2. 过滤无观测数据的空索引 max_speed_idx = max_speed_idx.dropna().astype(int) # 3. 提取对应行数据,补全全量日期 df_daily = df.loc[max_speed_idx].set_index('date').resample('D').asfreq()
运行后df_daily的输出如下,风向和最大风速匹配正确:
windSpeedHigh windSpeedHigh_Dir date 2019-01-01 155 NE 2019-01-02 45 W 2019-01-03 NaN NaN 2019-01-04 NaN NaN ... ... ... 2019-07-03 NaN NaN 2019-07-04 15 S
方案2:groupby+apply(灵活度更高)
如果需要自定义更多聚合逻辑,可以用分组自定义函数实现:
def get_daily_max(group): # 返回分组内风速最大的第一行数据 return group.loc[group['windSpeedHigh'].idxmax()] df_daily = df.set_index('date').groupby(pd.Grouper(freq='D')).apply(get_daily_max)
注意:如果单日存在多条相同最大风速的记录,上述两种方法都会默认取时间最早的那条,如需保留所有最大风速记录,可以调整逻辑返回所有匹配行。
内容的提问来源于stack exchange,提问作者Jordan Ford
相关产品推荐
相关产品推荐

