当前位置:首页>java>代码分享|土壤湿度时间序列分析与可视化:基于 ISMN 数据的 Python 实现

代码分享|土壤湿度时间序列分析与可视化:基于 ISMN 数据的 Python 实现

  • 2026-10-21 13:28:33
代码分享|土壤湿度时间序列分析与可视化:基于 ISMN 数据的 Python 实现
“在农业、气象和环境研究中,土壤湿度是一个重要指标,直接影响植物生长、灌溉需求与生态系统健康。本文演示如何使用 Python 加载 ISMN(国际土壤湿度网络)数据,完成时间序列提取与可视化,并支持导出与批量处理。”
一、主要功能
读取与加载 ISMN 数据集:通过 ISMN_Interface 加载土壤湿度数据,支持并行读取以加速元数据加载
选择目标网络与站点:按网络与站点名称定位站点,并查看传感器信息以确认选择
时间序列提取与可视化:提取传感器的土壤湿度数据并绘制随时间变化曲线
数据保存与导出:可将土壤湿度时间序列导出为 .dat(或其他分隔格式)文件
批量处理(可选):遍历所有网络/站点/传感器,批量生成图表并导出数据
二、代码示例(可直接运行)
提示:请先把 data_path 改成你本机解压后的 ISMN 数据目录。
import osimport numpy as npimport pandas as pdimport matplotlib.pyplot as pltfrom ismn.interface import ISMN_Interface# 设置解压后的数据目录路径(根据自己的路径)data_path = r'F:\ISMN土壤湿度\ismn666\ismn'# 初始化 ISMN_Interface (使用 parallel=True 加速元数据加载)ismn_data = ISMN_Interface(data_path, parallel=True)# 输出读取的数据集概览,查看所有网络信息print("数据集概览:")for network_name in ismn_data.networks:  # 获取网络列表    print(f"网络: {network_name},包含站点:{list(ismn_data[network_name].stations.keys())}")# 选择目标网络和站点network_name = 'ARM'station_name = 'Lamont-CF1'# 获取指定网络下的站点station = ismn_data[network_name][station_name]# 输出该站点的传感器信息print(f"\n站点 '{station_name}' 的传感器信息:")sensor_names = list(station.sensors.keys())  # 获取传感器名称列表print(sensor_names)# 选择指定传感器sensor_name = 'Hydraprobe-II-Sdi-12-E_soil_moisture_0.050000_0.050000'if sensor_name in sensor_names:    print(f"选择的传感器: {sensor_name}")else:    print(f"错误:传感器 '{sensor_name}' 在站点 '{station_name}' 中未找到。")    exit()  # 如果传感器不存在,停止执行# 获取该传感器的元数据,并将其转化为 DataFrame 显示sensor = station.sensors[sensor_name]  # 正确访问传感器sensor_metadata = sensor.metadata.to_pd()print(f"\n传感器 '{sensor_name}' 的元数据:")print(sensor_metadata)# 获取土壤湿度时间序列数据sensor_data = sensor.data# 可视化土壤湿度数据fig, ax = plt.subplots(figsize=(12, 6))sensor_data.plot(ax=ax)ax.set_xlabel('Date')ax.set_ylabel('Soil Moisture [$m^3 m^{-3}$]')ax.set_title(f"station '{station_name}' - sensor '{sensor_name}' Soil Moisture Time Series")plt.xticks(rotation=45)plt.tight_layout()plt.show()# 可选:将数据保存为文本文件,例如保存为 .dat 文件output_file = (    f"{station_name}_{sensor_name.replace('/', '_')}"    + "_soil_moisture.dat")sensor_data.to_csv(output_file, sep='\t', header=True, index=True)print(f"数据已保存到文件: {output_file}")# 额外功能:遍历所有网络、站点和传感器并导出数据def save_all_network_data():    # 遍历所有网络,选择特定的站点和传感器    for network_name in ismn_data.networks:        print(f"\n正在处理网络: {network_name}")        # 遍历该网络的所有站点        for station_name in ismn_data[network_name].stations:            station = ismn_data[network_name][station_name]            print(f"  正在处理站点: {station_name}")            # 遍历该站点的所有传感器            for sensor_name in station.sensors:                sensor = station.sensors[sensor_name]  # 使用正确的索引方式                print(f"    正在处理传感器: {sensor_name}")                # 获取土壤湿度数据并可视化                sensor_data = sensor.data                fig, ax = plt.subplots(figsize=(12, 6))                sensor_data.plot(ax=ax)                ax.set_xlabel('Date')                ax.set_ylabel('soil moisture [$m^3 m^{-3}$]')                ax.set_title(f"站点 '{station_name}' - 传感器 '{sensor_name}' 土壤湿度时间序列")                plt.xticks(rotation=45)                plt.tight_layout()                # 保存每个传感器的数据到文件                output_file = (                    f"{network_name}_{station_name}_{sensor_name.replace('/', '_')}"                    + "_soil_moisture.dat"                )                sensor_data.to_csv(output_file, sep='\t', header=True, index=True)                print(f"    数据已保存到文件: {output_file}")# 调用遍历函数,批量处理所有数据并保存# save_all_network_data()  # 如果你需要遍历所有站点数据,可以取消注释此行
通过这段代码,用户可以方便地获取并分析土壤湿度时间序列数据,并且通过 matplotlib 进行直观的可视化,助力农业、气象和生态保护领域的数据分析工作。无论是单个站点的分析,还是大规模数据的批量处理,代码都能满足需求,为土壤湿度研究提供有力支持。
三、运行结果示例
下图为示例站点(Lamont-CF1)土壤湿度时间序列可视化结果:
图:土壤湿度时间序列示例
四、小结
通过上述代码,你可以方便地获取并分析土壤湿度时间序列数据,并使用 matplotlib 进行直观可视化。无论是单站点分析还是批量处理大规模数据,都可按需扩展,服务农业、气象与生态保护等领域的数据分析工作。
后台回复【ISMN】获取示例数据。

分享人:

徐文洲,2024级硕士研究生

邮箱:wenzhouxu@njfu.edu.cn

徐文洲 | 供稿

江中天 | 排版

魏浩翰 | 审核

最新文章

随机文章