基于半小时时间序列,计算每日最后state=1后3小时内value的降幅
解决方案:按日计算指定时段内的value下降幅度
针对你的半小时粒度时间序列数据,我们可以用Python的pandas库高效处理,具体步骤如下:
1. 数据预处理
先读取数据并将date列转为datetime类型,设置为索引以方便时间操作:
import pandas as pd # 读取数据(若数据是csv格式,直接读取;也可直接构造DataFrame) df = pd.read_csv('your_data.csv', parse_dates=['date'], index_col='date') # 确保数据按时间顺序排列 df = df.sort_index()
2. 按日期分组计算下降幅度
按日期分组后,对每组执行以下操作:
- 筛选当日所有
state=1的记录,定位最后一次出现的时刻 - 提取该时刻之后3小时内的
value数据 - 计算绝对下降幅度和相对下降幅度
完整实现代码:
def calculate_drop(group): # 筛选当日state=1的记录 state_1_records = group[group['state'] == 1] if state_1_records.empty: # 当日无state=1的情况,返回空值 return pd.Series([None, None], index=['drop_abs', 'drop_pct']) # 获取最后一次state=1的时刻和对应value last_state_1_time = state_1_records.index[-1] last_state_1_value = state_1_records['value'].iloc[-1] # 定义3小时后的时间节点 end_time = last_state_1_time + pd.Timedelta(hours=3) # 提取该时段内的所有value数据 period_values = group.loc[last_state_1_time:end_time, 'value'] if len(period_values) <= 1: # 3小时内无后续数据,返回空值 return pd.Series([None, None], index=['drop_abs', 'drop_pct']) # 计算下降幅度 min_value = period_values.min() drop_abs = last_state_1_value - min_value # 绝对下降幅度 drop_pct = (drop_abs / last_state_1_value) * 100 # 相对下降百分比 return pd.Series([drop_abs, drop_pct], index=['drop_abs', 'drop_pct']) # 按日期分组应用计算逻辑 daily_result = df.groupby(df.index.date).apply(calculate_drop) # 重置索引,将日期转为列 daily_result = daily_result.reset_index().rename(columns={'index': 'date'}) print(daily_result)
代码说明
- 空值处理:如果当日没有
state=1的记录,或最后一次state=1后3小时内无数据,返回NaN避免报错 - 下降幅度定义:
- 绝对下降幅度:最后一次
state=1时的value减去后续3小时内的最小value - 相对下降幅度:绝对下降幅度占初始value的百分比,用于直观展示下降比例
- 绝对下降幅度:最后一次
- 时间范围:
last_state_1_time:end_time会包含起始时刻到结束时刻的所有半小时粒度数据,匹配你的序列间隔
示例输出(对应你提供的2017-01-10数据)
假设当日最后一次state=1的时刻是2017-01-10 21:30,对应value为23,3小时内的value包括23、20、18、17、16,最小value是16,输出结果为:
date drop_abs drop_pct 0 2017-01-10 7.0 30.434783
内容的提问来源于stack exchange,提问作者kultuhtu
相关产品推荐
相关产品推荐

