包含时间维度的格点气象数据一般按“time * lat * lon” 形式保存为netcdf文件。当time维度比较大的时候(比如几百个或跟多),单个文件数据较多,分析时读取时效可能会比较慢,这种情况你可能想把一个较大数据分割为多个小数据。一个高效的工具是nco,本文利用python + nco,批量将月文件分割为日文件。
数据:ERA5 逐小时地面气象数据,每个自然月一个文件(一月:744*180*360),共12个月(12个文件)。
目标:分割为每个自然日一个文件,每个日文件存放当天24个小时的数据(24*180*360)。
原文件如下图:
思路:利用python进行月循环、日循环,并调用系统的nco命令进行逐日的分割、输出。
程序如下:
import os
year=2019
month=[1,2,3,4,5,6,7,8,9,10,11,12]
ndays=[31,28,31,30,31,30,31,31,30,31,30,31]
for im in month:
for idy in range(1,ndays[im-1]+1):
first_t = idy*24-23
last_t = idy*24
#print(first_t,last_t)
if im < 10:
if idy < 10:
command = 'ncea -F -d time,{},{} ./ERA5_surface_hrly_{}0{}.nc ./ERA5_surface_hrly_{}0{}0{}.nc'.format(first_t,last_t,year,im,year,im,idy)
else:
command = 'ncea -F -d time,{},{} ./ERA5_surface_hrly_{}0{}.nc ./ERA5_surface_hrly_{}0{}{}.nc'.format(first_t,last_t,year,im,year,im,idy)
else:
if idy < 10:
command = 'ncea -F -d time,{},{} ./ERA5_surface_hrly_{}{}.nc ./ERA5_surface_hrly_{}{}0{}.nc'.format(first_t,last_t,year,im,year,im,idy)
else:
command = 'ncea -F -d time,{},{} ./ERA5_surface_hrly_{}{}.nc ./ERA5_surface_hrly_{}{}{}.nc'.format(first_t,last_t,year,im,year,im,idy)
print(command)
os.system(command)
~
分割后1月数据如下: