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

聚合Pandas DataFrame提取主频率:非均匀采样数据处理求助

嘿,我完全懂你现在的痛点——非均匀采样数据做小时级窗口的主频率分析,确实比均匀采样棘手很多,不过scipy.signal.lombscargle刚好就是专门解决这类问题的工具,我来一步步带你落地实现:

非均匀采样数据小时级主频率提取方案

1. 先完成数据的小时分组

首先得把你的DataFrame按小时窗口拆分,用pandas的分组功能就能轻松搞定:

import pandas as pd
import numpy as np
from scipy.signal import lombscargle

# 假设你的数据是df,时间列名为'timestamp',待分析的数值列是'value'
# 先给每条数据打上所属小时的标签
df['hour_window'] = df['timestamp'].dt.floor('H')
# 按小时分组
hourly_groups = df.groupby('hour_window')

2. 编写Lomb-Scargle频率分析函数

针对每个小时窗口,我们需要完成:时间归一化、频率范围定义、功率谱计算、提取前两个最高功率的频率。这里写一个可复用的函数:

def extract_top_two_freqs(group, freq_min=0.001, freq_max=0.1, num_freq_bins=1000):
    # 提取当前窗口的时间序列和数值序列
    timestamps = group['timestamp']
    values = group['value']
    
    # 把时间转换为相对于窗口起始时间的秒数(避免绝对时间的大数值干扰)
    relative_time = (timestamps - timestamps.min()).dt.total_seconds().values
    # 对数值去均值,消除直流分量对功率谱的影响
    normalized_values = values - values.mean()
    
    # 生成要检测的频率数组(注意lombscargle需要的是角频率,所以后面要乘2π)
    freq_array = np.linspace(freq_min, freq_max, num_freq_bins)
    # 计算Lomb-Scargle功率谱
    power_spectrum = lombscargle(relative_time, normalized_values, freq_array * 2 * np.pi)
    
    # 按功率从高到低排序,取前两个频率
    sorted_indices = np.argsort(power_spectrum)[::-1][:2]
    top_freqs = freq_array[sorted_indices]
    top_powers = power_spectrum[sorted_indices]
    
    # 返回结构化结果
    return pd.Series({
        'top1_frequency': top_freqs[0],
        'top1_power': top_powers[0],
        'top2_frequency': top_freqs[1],
        'top2_power': top_powers[1]
    })

3. 应用函数到所有分组并合并结果

把上面的函数应用到每个小时分组,再和你已经计算好的统计量(均值、标准差、偏度)合并:

# 计算每个小时窗口的主频率
freq_analysis_results = hourly_groups.apply(extract_top_two_freqs).reset_index()

# 假设你已经有一个包含小时级统计量的DataFrame叫hourly_stats,合并频率结果
final_hourly_stats = hourly_stats.merge(freq_analysis_results, on='hour_window')

几个关键细节要注意

  • 频率范围调整:freq_min和freq_max要贴合你的数据特性,比如如果你的数据采样间隔是几分钟级,频率范围可以设为0.001Hz(约15分钟周期)到0.1Hz(约10秒周期)
  • 频率分辨率:num_freq_bins越大,频率的分辨率越高,但计算耗时也会增加,根据你的数据量和精度需求调整
  • 去均值的必要性:如果跳过数值归一化,直流分量(也就是信号的均值)会占据最大的功率,导致你找不到真正的信号频率
  • 时间归一化:把绝对时间转为相对时间,能避免大数值时间戳带来的计算精度损失

内容的提问来源于stack exchange,提问作者Behinoo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:25:49