You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从降水时间序列提取风暴时长并绘制经验累积分布函数(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 21:35:25