求助:如何计算风速连续大于10的时长?附错误Python代码
计算风速连续大于10的时长解决方案
原代码的核心问题有两个:
- 用
apply(axis=1)逐行遍历数据,对大数据集效率极低,且逻辑完全跑偏——你找的是风速小于当前行风速的下一个时间点,而非风速降到10以下的节点,根本不符合需求。 - 没有对连续超10的风速区间做分组,无法直接统计连续时段的时长。
以下是正确的实现方案:
步骤1:预处理数据
先确保时间列和风速列的类型正确,避免后续计算报错:
import pandas as pd # 转换DateTime列为datetime类型 df['DateTime'] = pd.to_datetime(df['DateTime']) # 转换风速列为数值型(如果原数据是字符串格式) df['Измеренная_скорость_ветра'] = pd.to_numeric(df['Измеренная_скорость_ветра'], errors='coerce')
步骤2:标记风速超10的行,生成连续区间分组ID
通过cumsum实现连续区间的分组:当风速从≤10变为>10时,分组ID自动递增,以此区分不同的连续超10时段:
# 标记风速大于10的行 df['wind_over_10'] = df['Измеренная_скорость_ветра'] > 10 # 生成连续区间的分组ID df['group_id'] = (~df['wind_over_10']).cumsum()
步骤3:计算每个连续超10区间的时长
对每个分组(仅保留风速超10的分组),统计该区间的起止时间及时长:
# 按分组ID聚合,计算每个连续超10时段的时长 duration_df = df[df['wind_over_10']].groupby('group_id').agg( 开始时间=('DateTime', 'min'), 结束时间=('DateTime', 'max'), 持续时长=('DateTime', lambda x: x.max() - x.min()) ).reset_index(drop=True) # 可选:把时长转成秒数 duration_df['持续时长_秒'] = duration_df['持续时长'].dt.total_seconds()
步骤4(可选):将时长映射回原数据集
如果需要给原数据的每一行标记其所属连续超10区间的时长:
# 把时长数据合并回原df df = df.merge( duration_df[['group_id', '持续时长', '持续时长_秒']], on='group_id', how='left' ) # 风速≤10的行时长设为空值或0 df.loc[~df['wind_over_10'], ['持续时长', '持续时长_秒']] = pd.NA
这个方案效率远高于逐行遍历,且能准确统计所有连续风速超10的时段时长。
内容的提问来源于stack exchange,提问作者Shohmirzo Umarov
相关产品推荐
相关产品推荐

