如何将netcdf时间序列数据转换为按纬度分类的单个文本数据?

问题描述 投票:0回答:1

我正在为基于 Fortran 的 DGVM 准备新的输入数据,但我在根据将使用的 DGVM 格式调整数据时遇到问题。我正在 Linux 服务器上执行此任务。

这是我将使用的气候数据: 下载气候数据 MIROC6 1851 年至 1860 年历史每月气温数据 (0.5 x 0.5)。

我需要按顺序执行这些步骤

  1. 文本输出数据必须分为360个文件夹(每个文件夹代表1-360的纬度) 示例文件夹 1-360
  2. 每个文件夹中将有 720 个文本文件(代表该纬度/文件夹上的经度 1-720) 每个文件夹内的示例 txt 文件:1-720
  3. txt文件中,数据从上到下的顺序代表月度数据(1月到12月,重复)。

我尝试通过多种方法转换 netcdf 数据:CDO、NCO 和 ncdump comamnd,我能够获得整个网格值的一种 .txt 格式。但根据需要的格式手动提取/分类单个网格值将花费大量时间。 我希望有其他有效的方法来转换这些数据,并且我希望有人愿意帮助我解决这个问题。

谢谢你。

converters latitude-longitude netcdf txt
1个回答
0
投票

我通过在循环中使用 CDO

outputtab
运算符找到了一个解决方案,该解决方案是用简单的 Linux bash 脚本编写的。每 20 个点进行一次转换过程,以避免对服务器 CPU 造成沉重负载(可以调整)。

我创建的代码如下:

#!/bin/bash

# Define input file and log file
input_file="/path/canesm5_r1i1p1f1_w5e5_ssp126_tas_global_daily_2015_2100_05gc.nc"
log_file="log.txt"

# Remove existing log file if it exists
rm -f $log_file

# Function to extract data for a specific latitude
extract_latitude() {
    lat=$1
    lon_index=1
    max_jobs=20
    job_count=0

    # Loop through longitudes from -180 to 180 in 0.5 degree increments
    for lon in $(seq -180 0.5 179.5); do
        # Define the output file name based on the current latitude and longitude index
        output_file="${lat}_${lon_index}.txt"
        
        # Extract data for the grid point at the current latitude and longitude, save only values, and remove the header
        (cdo -outputtab,value -remapnn,lon=${lon}_lat=${lat} $input_file | sed '1d' > $output_file) &>> $log_file &
        
        # Increment the longitude index and job count
        lon_index=$((lon_index + 1))
        job_count=$((job_count + 1))

        # Check if the max number of jobs has been reached
        if [ $job_count -ge $max_jobs ]; then
            wait  # Wait for all background jobs to complete
            job_count=0  # Reset job count
        fi
    done

    # Wait for any remaining background processes to finish
    wait
}

# Loop through latitudes from 90N to -90S in 0.5 degree increments
for lat in $(seq 90 -0.5 -90); do
    echo "Extracting data for latitude $lat"
    extract_latitude $lat
done

echo "Data extraction completed. Check $log_file for details."

谢谢你

© www.soinside.com 2019 - 2024. All rights reserved.