使用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.其余使用方式
- 合并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’]
- 自动查找并合并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的方法。这样可以进行一些快速的前置处理。