如何从降水时间序列提取风暴时长并绘制经验累积分布函数(CDF)?
提取风暴时长列表并绘制经验CDF的实现方法
一、从降水时间序列提取风暴时长列表
核心逻辑
通过阈值标记降水时段,识别连续的降水事件,计算每个事件的持续时长并整理为列表。
规则时间序列实现(固定观测间隔)
假设你的降水数据是带datetime索引的Pandas Series:
import pandas as pd import numpy as np # 示例数据(替换为你的真实降水序列) time_index = pd.date_range(start='2023-01-01', end='2023-01-10', freq='H') precip_series1 = pd.Series(np.random.randint(0, 5, size=len(time_index)), index=time_index) precip_series2 = pd.Series(np.random.randint(0, 4, size=len(time_index)), index=time_index) threshold = 0.1 # 自定义降水阈值,比如0.1mm def extract_storm_durations(precip_series, threshold): # 1. 标记降水时段:大于阈值为降水,否则为无降水 is_precip = precip_series > threshold # 2. 识别连续降水事件:通过移位对比生成唯一事件ID event_ids = (is_precip != is_precip.shift()).cumsum() # 3. 筛选降水事件并计算时长(规则序列直接取连续点数,对应观测间隔) storm_events = is_precip[is_precip].groupby(event_ids).count() # 4. 转换为时长列表(示例单位为小时,对应小时频率) return storm_events.values.tolist() # 获取两组风暴时长列表 durations_list1 = extract_storm_durations(precip_series1, threshold) durations_list2 = extract_storm_durations(precip_series2, threshold)
不规则时间序列适配(非固定观测间隔)
如果观测时间间隔不固定,修改时长计算逻辑为实际时间差总和:
def extract_storm_durations_irregular(precip_series, threshold): is_precip = precip_series > threshold event_ids = (is_precip != is_precip.shift()).cumsum() storm_durations = [] # 遍历每个降水事件,计算实际持续时长 for event_id in event_ids[is_precip].unique(): event_time_range = precip_series[event_ids == event_id].index # 转换为小时单位,可按需调整为分钟/天 total_hours = (event_time_range[-1] - event_time_range[0]).total_seconds() / 3600 storm_durations.append(total_hours) return storm_durations
二、绘制两组风暴时长的经验CDF
核心逻辑
经验CDF的计算逻辑:将时长数据排序后,每个数据点对应的累积概率为(当前数据的排名) / 总数据量,通过折线图直观展示分布差异。
代码实现
import matplotlib.pyplot as plt def plot_empirical_cdf(durations, label, color): # 1. 对时长数据排序 sorted_durations = np.sort(durations) # 2. 计算经验累积概率 cdf_values = np.arange(1, len(sorted_durations)+1) / len(sorted_durations) # 3. 绘制CDF曲线 plt.plot(sorted_durations, cdf_values, marker='.', linestyle='-', label=label, color=color) # 创建画布并绘制两组CDF plt.figure(figsize=(8, 5)) plot_empirical_cdf(durations_list1, '降水序列1', '#1f77b4') plot_empirical_cdf(durations_list2, '降水序列2', '#ff7f0e') # 设置图表属性 plt.xlabel('风暴时长 (小时)') plt.ylabel('经验累积概率') plt.title('两组降水序列风暴时长的经验CDF对比') plt.legend() plt.grid(True, alpha=0.3) plt.show()
优化说明
- 若需要更平滑的曲线,可结合核密度估计(KDE)辅助,但经验CDF通常直接用排序点绘制即可保留原始分布特征。
- 可通过调整
marker、linestyle参数优化图表样式,适配不同可视化需求。
内容的提问来源于stack exchange,提问作者mir farhan
相关产品推荐
相关产品推荐

