【使用python-cdo处理nc文件】

使用python-cdo处理nc文件



前言

服务器中原本安装了CDO但是由于一些原因无法直接使用,这里查询到还有另外一种cdo的类似的用法。


一、安装cdo?

pip install cdo
conda install python-cdo

倘若值安装了cdo
测试时则会

from cdo import *
cdo = Cdo()
cdo.sinfon(input='tas_Amon_CESM2_hist-aer_r3i1p1f1_gn_185001-189912.nc')

报错
两个都同步安装之后:
成功运行

二、使用步骤

1.引入库

代码如下(示例):

from cdo import *
cdo = Cdo()

2.读取数据信息

代码如下(示例):

from cdo import *
cdo = Cdo()
cdo.sinfon(input='tas_Amon_CESM2_hist-aer_r3i1p1f1_gn_185001-189912.nc')

‘File format : NetCDF4 zip’,
‘-1 : Institut Source T Steptype Levels Num Points Num Dtype : Parameter name’,
‘1 : unknown CESM2 v instant 1 1 55296 1 F32z : tas’,
‘Grid coordinates :’,
‘1 : lonlat : points=55296 (288x192)’,
‘lon : 0 to 358.75 by 1.25 degrees_east circular’,
‘lat : -90 to 90 by 0.9424084 degrees_north’,
‘available : cellbounds’,
‘Vertical coordinates :’,
‘1 : surface : levels=1’,
‘Time coordinate :’,
‘time : 600 steps’,
‘RefTime = 0001-01-01 00:00:00 Units = days Calendar = 365_day Bounds = true’,
‘YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss YYYY-MM-DD hh:mm:ss’,
‘1850-01-15 12:00:00 1850-02-14 00:00:00 1850-03-15 12:00:00 1850-04-15 00:00:00’,
‘1850-05-15 12:00:00 1850-06-15 00:00:00 1850-07-15 12:00:00 1850-08-15 12:00:00’,
‘1850-09-15 00:00:00 1850-10-15 12:00:00 1850-11-15 00:00:00 1850-12-15 12:00:00’,
‘1851-01-15 12:00:00 1851-02-14 00:00:00 1851-03-15 12:00:00 1851-04-15 00:00:00’,
‘1851-05-15 12:00:00 1851-06-15 00:00:00 1851-07-15 12:00:00 1851-08-15 12:00:00’,
‘1851-09-15 00:00:00 1851-10-15 12:00:00 1851-11-15 00:00:00 1851-12-15 12:00:00’,
‘1852-01-15 12:00:00 1852-02-14 00:00:00 1852-03-15 12:00:00 1852-04-15 00:00:00’,
‘1852-05-15 12:00:00 1852-06-15 00:00:00 1852-07-15 12:00:00 1852-08-15 12:00:00’,
‘1852-09-15 00:00:00 1852-10-15 12:00:00 1852-11-15 00:00:00 1852-12-15 12:00:00’,
‘1853-01-15 12:00:00 1853-02-14 00:00:00 1853-03-15 12:00:00 1853-04-15 00:00:00’,
‘1853-05-15 12:00:00 1853-06-15 00:00:00 1853-07-15 12:00:00 1853-08-15 12:00:00’,

‘1898-05-15 12:00:00 1898-06-15 00:00:00 1898-07-15 12:00:00 1898-08-15 12:00:00’,
‘1898-09-15 00:00:00 1898-10-15 12:00:00 1898-11-15 00:00:00 1898-12-15 12:00:00’,
‘1899-01-15 12:00:00 1899-02-14 00:00:00 1899-03-15 12:00:00 1899-04-15 00:00:00’,
‘1899-05-15 12:00:00 1899-06-15 00:00:00 1899-07-15 12:00:00 1899-08-15 12:00:00’,
‘1899-09-15 00:00:00 1899-10-15 12:00:00 1899-11-15 00:00:00 1899-12-15 12:00:00’]

3.其余使用方式

  1. 合并nc文件的时间
from cdo import Cdo
cdo = Cdo()

# 合并文件列表
input_files = [
    "r1/tas_Amon_CESM2_hist-aer_r1i1p1f1_gn_185001-189912.nc",
    "r1/tas_Amon_CESM2_hist-aer_r1i1p1f1_gn_190001-194912.nc",
    "r1/tas_Amon_CESM2_hist-aer_r1i1p1f1_gn_195001-199912.nc",
    "r1/tas_Amon_CESM2_hist-aer_r1i1p1f1_gn_200001-201412.nc"
]

# 合并后输出文件名
output_file = "r1/tas_Amon_CESM2_hist-aer_r1i1p1f1_gn_185001-201412.nc"

# 使用 mergetime 合并时间维度上的文件
cdo.mergetime(input=" ".join(input_files), output=output_file)

‘r1/tas_Amon_CESM2_hist-aer_r1i1p1f1_gn_185001-201412.nc’
批量处理不同实验的结果

import os
from cdo import Cdo
cdo = Cdo()

experiments = ['historical', 'hist-aer', 'hist-nat', 'hist-GHG']

for ex in experiments:
    print(f"开始处理实验: {ex}")
    
    input_files = [
        f"r1/tas_Amon_CESM2_{ex}_r1i1p1f1_gn_185001-189912.nc",
        f"r1/tas_Amon_CESM2_{ex}_r1i1p1f1_gn_190001-194912.nc",
        f"r1/tas_Amon_CESM2_{ex}_r1i1p1f1_gn_195001-199912.nc",
        f"r1/tas_Amon_CESM2_{ex}_r1i1p1f1_gn_200001-201412.nc"
    ]

    # 检查所有输入文件是否存在
    missing = [f for f in input_files if not os.path.exists(f)]
    if missing:
        print(f"[跳过] 缺少以下文件:{missing}")
        continue

    output_file = f"r1/tas_Amon_CESM2_{ex}_r1i1p1f1_gn_185001-201412.nc"

    try:
        cdo.mergetime(input=" ".join(input_files), output=output_file)
        print(f"[完成] 合并成功:{output_file}")
    except Exception as e:
        print(f"[错误] 合并失败:{ex},错误信息:{e}")

开始处理实验: historical
[跳过] 缺少以下文件:[‘r1/tas_Amon_CESM2_historical_r1i1p1f1_gn_185001-189912.nc’, ‘r1/tas_Amon_CESM2_historical_r1i1p1f1_gn_190001-194912.nc’, ‘r1/tas_Amon_CESM2_historical_r1i1p1f1_gn_195001-199912.nc’, ‘r1/tas_Amon_CESM2_historical_r1i1p1f1_gn_200001-201412.nc’]
开始处理实验: hist-aer
[完成] 合并成功:r1/tas_Amon_CESM2_hist-aer_r1i1p1f1_gn_185001-201412.nc
开始处理实验: hist-nat
[完成] 合并成功:r1/tas_Amon_CESM2_hist-nat_r1i1p1f1_gn_185001-201412.nc
开始处理实验: hist-GHG
[跳过] 缺少以下文件:[‘r1/tas_Amon_CESM2_hist-GHG_r1i1p1f1_gn_200001-201412.nc’]

  1. 自动查找并合并nc文件
import os
import glob
from cdo import Cdo
cdo = Cdo()

experiment = 'piControl'
input_pattern = f"r1/tas_Amon_CESM2_{experiment}_r1i1p1f1_gn_*.nc"

# 查找并排序所有片段文件
input_files = sorted(glob.glob(input_pattern))

# 输出文件名
output_file = f"r1/tas_Amon_CESM2_{experiment}_r1i1p1f1_gn_000101-120012.nc"

# 检查是否找到了所有文件
if not input_files:
    print("[错误] 没有找到任何控制实验文件。请确认路径和文件名是否正确。")
else:
    print(f"[信息] 找到 {len(input_files)} 个文件,开始合并为:{output_file}")
    try:
        cdo.mergetime(input=" ".join(input_files), output=output_file)
        print(f"[完成] 合并成功:{output_file}")
    except Exception as e:
        print(f"[错误] 合并失败,错误信息:{e}")

[信息] 找到 12 个文件,开始合并为:r1/tas_Amon_CESM2_piControl_r1i1p1f1_gn_000101-120012.nc
[完成] 合并成功:r1/tas_Amon_CESM2_piControl_r1i1p1f1_gn_000101-120012.nc

总结

以上就是有关于如何安装和使用python-cdo的方法。这样可以进行一些快速的前置处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值