問題描述:
若干個nc文件儲存全球的1850-2014年月尺度的mrro數據(或其他數據),從1850-1到2014-12一共1980個月,要提取出最后35年1980.1~2014.12年也就是420個月的數據。
代碼實現
def aaa(input_file,output_file,bianliang,start_index,end_index):# 打開輸入NetCDF文件ds = nc.Dataset(input_file, 'r')# 獲取時間變量和mrro變量 這里不一定是mrro變量,名稱由傳入參數bianliang確定time_var = ds.variables['time']mrro_var = ds.variables[bianliang]time_indices = np.arange(start_index, end_index)time_data = time_var[time_indices]mrro_data = mrro_var[time_indices, :, :] # 創建新的NetCDF文件new_ds = nc.Dataset(output_file, 'w', format='NETCDF4')# 創建維度(這些在新數據集中還不存在)new_ds.createDimension('time', None) # 可變長度維度,或者指定確切長度len(time_data)lat_dim = new_ds.createDimension('lat', len(ds.dimensions['lat']))lon_dim = new_ds.createDimension('lon', len(ds.dimensions['lon']))# 創建新變量times = new_ds.createVariable('time', time_var.datatype, ('time',))lats = new_ds.createVariable('lat', ds.variables['lat'].datatype, ('lat',))lons = new_ds.createVariable('lon', ds.variables['lon'].datatype, ('lon',))mrro = new_ds.createVariable(bianliang, mrro_var.datatype, ('time', 'lat', 'lon'))# 復制變量屬性times.setncatts({k: time_var.getncattr(k) for k in time_var.ncattrs()})lats.setncatts({k: ds.variables['lat'].getncattr(k) for k in ds.variables['lat'].ncattrs()})lons.setncatts({k: ds.variables['lon'].getncattr(k) for k in ds.variables['lon'].ncattrs()})mrro.setncatts({k: mrro_var.getncattr(k) for k in mrro_var.ncattrs()})# 寫入數據times[:] = time_data # 確保time_data是正確的!lats[:] = ds.variables['lat'][:]lons[:] = ds.variables['lon'][:]mrro[:] = mrro_data # 確保mrro_data是正確的!# 復制全局屬性new_ds.setncatts({k: ds.getncattr(k) for k in ds.ncattrs() if k != 'history'}) # 避免覆蓋我們即將設置的歷史屬性# 更新歷史屬性history = "Created by subsetting the original dataset" # 原始數據集的歷史屬性可能不包含有用的信息,或者我們想要添加新的信息new_ds.setncattr('history', history)# 關閉文件new_ds.close()ds.close()print("完成")
import glob
import netCDF4 as nc
import numpy as np
import osdef get_nc_files(directory):# 使用 os.path.join 確保路徑格式正確pattern = os.path.join(directory, '*.nc')nc_files = glob.glob(pattern)# 如果只需要文件名而不是完整路徑,可以使用 os.path.basename 提取nc_files = [os.path.basename(file) for file in nc_files]return nc_filesstart_index = 1560 # 數據起點
end_index = 1980 # 數據終點
directory_path = './'
nc_files_list = get_nc_files(directory_path)
for ncfile in nc_files_list:print(ncfile)input_file = ncfiles = ''s += str(ncfile)output_file = s.replace('185001', '198001')bianliang = input_file.split('_')[0] # 根據文件名稱獲取變量名aaa(input_file,output_file,bianliang,start_index,end_index)
將python文件和待處理文件放一起
運行代碼
依賴庫
netCDF4
numpy
高版本python直接pip install 安裝?
netCDF4
numpy
低版本python(我用的3.7,用pip直接安裝netCDF4總報錯)
解決辦法:
pip install "netCDF4<1.6.0"
安裝低版本的netCDF4,搞定。
ps: 代碼粗糙,歡迎交流學習。