Python中如何将PPSD的temporal绘图数据保存为CSV文件
问题分析
你遇到的问题很典型:ppsd.plot_temporal()这个方法的作用是生成并保存图像,它不会返回绘图背后的原始数据——所以你用temp = ppsd.plot_temporal(...)得到的其实是None,自然存不出有效的CSV内容。
Obspy的PPSD对象专门提供了另一个方法来获取这些时间序列数据:get_temporal(),这才是你需要用来提取数据的工具。
解决方案
下面是修改后的代码,我会把获取数据、整理成CSV的步骤整合到你的原有代码中:
首先,替换你尝试的Pandas代码部分,改成以下逻辑:
- 用
get_temporal()获取原始时间序列数据 - 把数据整理成结构化的DataFrame
- 保存为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
相关产品推荐
相关产品推荐

