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

Python中如何将PPSD的temporal绘图数据保存为CSV文件

问题分析

你遇到的问题很典型:ppsd.plot_temporal()这个方法的作用是生成并保存图像,它不会返回绘图背后的原始数据——所以你用temp = ppsd.plot_temporal(...)得到的其实是None,自然存不出有效的CSV内容。

Obspy的PPSD对象专门提供了另一个方法来获取这些时间序列数据:get_temporal(),这才是你需要用来提取数据的工具。

解决方案

下面是修改后的代码,我会把获取数据、整理成CSV的步骤整合到你的原有代码中:

首先,替换你尝试的Pandas代码部分,改成以下逻辑:

  1. 用get_temporal()获取原始时间序列数据
  2. 把数据整理成结构化的DataFrame
  3. 保存为CSV文件

修改后的完整代码片段

from obspy.core import read
from obspy.io.xseed import Parser
from obspy.signal import PPSD
from obspy.imaging.cm import pqlx
import glob
import pandas as pd

# 遍历所有mseed文件
for data in glob.glob("F:/SKRIPSI/MSEED/*.mseed"):
    st = read(data)
    tr = st.select()[0]
    
    # 匹配对应的dseed文件
    for dataless in glob.glob("F:/SKRIPSI/MSEED/*.dseed"):
        if data.rsplit(".", 1)[0] == dataless.rsplit(".", 1)[0]:
            parser = Parser(dataless)
            
            # 初始化并添加数据到PPSD
            ppsd = PPSD(tr.stats, metadata=parser)
            ppsd.add(st)
            
            # 生成各种PPSD图像(保留你原来的代码)
            ppsd.plot(filename=f"{data.rsplit('.',1)[0]}_01_PPSD.png")
            ppsd.plot(filename=f"{data.rsplit('.',1)[0]}_02_PPSD cumulative.png", cumulative=True)
            ppsd.plot(filename=f"{data.rsplit('.',1)[0]}_03_PPSD pqlx.png", cmap=pqlx)
            ppsd.plot_spectrogram(filename=f"{data.rsplit('.',1)[0]}_04_PPSD spectrogram.png", show=False)
            ppsd.plot_temporal([0.1, 1, 10], filename=f"{data.rsplit('.',1)[0]}_05_PPSD temporal.png", show=False)
            
            # ------------------- 新增:提取并保存temporal数据为CSV -------------------
            # 获取temporal原始数据:返回一个字典,键是周期值,值是(时间戳, PSD值)的数组
            temporal_data = ppsd.get_temporal([0.1, 1, 10])
            
            # 整理数据为DataFrame
            df_list = []
            for period, ts_data in temporal_data.items():
                # ts_data是二维数组:第一列是Unix时间戳,第二列是PSD值
                df = pd.DataFrame(ts_data, columns=["timestamp", f"PSD_{period}s"])
                df_list.append(df)
            
            # 按时间戳合并所有周期的数据(确保时间序列对齐)
            merged_df = df_list[0]
            for df in df_list[1:]:
                merged_df = pd.merge(merged_df, df, on="timestamp")
            
            # 可选:把Unix时间戳转成人类可读的datetime格式
            merged_df["timestamp"] = pd.to_datetime(merged_df["timestamp"], unit="s")
            
            # 保存为CSV
            csv_filename = f"{data.rsplit('.',1)[0]}_05_PPSD temporal.csv"
            merged_df.to_csv(csv_filename, index=False)
            print(f"已保存CSV文件:{csv_filename}")

代码说明

  • ppsd.get_temporal([0.1, 1, 10]):返回一个字典,每个键是你指定的周期(0.1、1、10秒),对应的值是(N,2)的numpy数组,第一列是Unix时间戳,第二列是该周期下的PSD数值。
  • 我们把每个周期的数据转成单独的DataFrame,然后按时间戳合并,这样CSV里会有一列时间戳,以及对应三个周期的PSD值,结构清晰易读。
  • 可选的时间戳转换:如果不需要Unix戳,可以用pd.to_datetime()转成YYYY-MM-DD HH:MM:SS格式,方便后续分析。

这样你就能得到包含完整绘图数据的CSV文件了,不会再是空文件啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:13:42