技术求助:实现新增列计算风速持续高于前值的时长(秒)
解决风速持续递增时长的计算问题
你的需求是为DataFrame新增一列,记录从当前时刻开始,风速持续大于前一时刻值的时长(单位:秒),但原代码存在逻辑偏差和效率问题,以下是修正方案:
原代码问题分析
- 逻辑错误:你当前的代码是寻找当前时间之后第一个风速小于当前风速的时间点,这和“风速持续大于前一时刻”的需求不匹配——需求关注的是风速相对于前一行的变化趋势,而非相对于当前行的风速大小。
- 效率低下:
apply(axis=1)是逐行遍历,数据量大时性能极差,应优先使用Pandas向量化操作。
正确实现步骤与代码
实现逻辑
- 标记每一行的风速是否大于前一时刻的值
- 将连续的风速递增行划分为同一个分组,便于计算每个递增区间的结束时间
- 为每个分组匹配对应的结束时间,计算当前行到结束时间的秒数差
完整代码
import pandas as pd # 确保DateTime列为datetime类型(若未转换先执行此步) df['DateTime'] = pd.to_datetime(df['DateTime']) # 1. 标记风速是否大于前一时刻(第一行无前置数据,设为False) df['wind_increase'] = df['Скорость ветра, м/с'] > df['Скорость ветра, м/с'].shift(1) df['wind_increase'].iloc[0] = False # 2. 划分连续递增的分组:每次出现不递增时,分组ID累加 df['group'] = (~df['wind_increase']).cumsum() # 3. 获取每个分组的最后时间点(即递增状态结束的时间) group_end_time = df.groupby('group')['DateTime'].transform('max') # 4. 计算持续时长(秒),非递增行的时长设为0 df['continuous_increase_seconds'] = (group_end_time - df['DateTime']).dt.total_seconds() df.loc[df['wind_increase'] == False, 'continuous_increase_seconds'] = 0 # 可选:删除中间辅助列 df = df.drop(['wind_increase', 'group'], axis=1) print(df)
代码说明
- 风速递增标记:通过
shift(1)获取前一行风速,比较后得到当前行是否处于递增状态 - 分组划分:
(~df['wind_increase']).cumsum()会在每次出现“风速不递增”时累加分组ID,自动将连续的递增行归为同一组 - 结束时间匹配:
transform('max')为分组内所有行返回该组的最后时间点,确保同一递增区间的行都能获取到状态结束时间 - 时长转换:
dt.total_seconds()将时间差直接转为秒数,同时将不处于递增状态的行时长设为0
内容的提问来源于stack exchange,提问作者Shohmirzo Umarov
相关产品推荐
相关产品推荐

