Python时间序列按月份汇总计算signal_value大于5的占比方法
实现步骤与代码
- 前置依赖:确保已安装pandas库
- 第一步:转换时间戳格式
先将DataFrame的timestamp字段转换为datetime类型,避免后续时间运算报错:
import pandas as pd df['timestamp'] = pd.to_datetime(df['timestamp'])
- 第二步:按月分组计算占比(适配等间隔采样场景,绝大多数时序场景适用)
等间隔采样的场景下,行数占比完全等于时间占比,直接对布尔值求均值即可得到目标占比:
monthly_gt5_ratio = df.groupby(df['timestamp'].dt.to_period('M'))['signal_value'].apply( lambda x: (x > 5).mean() ).reset_index(name='monthly_gt5_ratio') print(monthly_gt5_ratio)
输出结果包含两列:timestamp列格式为YYYY-MM对应月份,monthly_gt5_ratio为对应月份内信号值大于5的时间占比,取值范围为0-1,需要百分比格式可自行乘以100。
- 补充:非等间隔采样场景加权计算
如果你的时间序列采样间隔不固定,需要按时间差加权计算真实时间占比:
# 先按时间戳升序排序 df = df.sort_values('timestamp', ignore_index=True) # 计算每条记录对应的有效时间长度 df['duration'] = df['timestamp'].shift(-1) - df['timestamp'] df['duration'] = df['duration'].ffill() # 最后一条记录用前序间隔填充,可按业务需求调整 # 加权计算占比 monthly_gt5_ratio = df.groupby(df['timestamp'].dt.to_period('M')).apply( lambda group: group[group['signal_value'] > 5]['duration'].sum() / group['duration'].sum() ).reset_index(name='monthly_gt5_weighted_ratio')
内容的提问来源于stack exchange,提问作者user17062211
相关产品推荐
相关产品推荐

