2015-03-09 4 views
0

У меня есть большая папка netCDF (.nc) файлов с одинаковым именем. Файлы данных содержат переменные времени, долготы, широты и ежемесячных осадков. Цель состоит в том, чтобы получать среднемесячные осадки за X лет в течение каждого месяца. Поэтому, в конце концов, у меня было бы 12 значений, представляющих среднемесячные осадки за X лет в течение каждого лата и долго. Каждый файл является одним и тем же местом на протяжении многих лет. Каждый файл начинается с тем же именем, и заканчивается в «date.sub.nc», например:Сочетание большого количества файлов netCDF

'data1.somthing.somthing1.avg_2d_Ind_Nx.200109.SUB.nc' 
'data1.somthing.somthing1.avg_2d_Ind_Nx.200509.SUB.nc' 
'data2.somthing.somthing1.avg_2d_Ind_Nx.201104.SUB.nc' 
'data2.somthing.somthing1.avg_2d_Ind_Nx.201004.SUB.nc' 
'data2.somthing.somthing1.avg_2d_Ind_Nx.201003.SUB.nc' 
'data2.somthing.somthing1.avg_2d_Ind_Nx.201103.SUB.nc' 
'data1.somthing.somthing1.avg_2d_Ind_Nx.201203.SUB.nc' 

концовка YearMonth.SUB.nc То, что я до сих пор:

array=[] 
f = nc.MFDataset('data*.nc') 
precp = f.variables['prectot'] 
time = f.variables['time'] 
array = f.variables['time','longitude','latitude','prectot'] 

Я получаю KeyError: ('время', 'долгота', 'широта', 'prectot'). Есть ли способ объединить все эти данные, чтобы я мог манипулировать им?

+0

Что вы подразумеваете под «объединением» данных? Это уже все в одном объекте MFDataset благодаря вашей строке 'f = nc.MFDataset ... '. Другими словами, массив 'f.variables ['prectot'] [:]' уже представляет собой трехмерный массив с размерами (время, широта и долгота), содержащие значения «prectot» для каждого (время, широта, долгота) , –

+1

Кроме того, re: ваш KeyError, 'f.variables' является Dict, и для любого Dict вы можете получить доступ только к одному из своих значений за раз, то есть' f.variables ['time'] 'или' f.variables [ 'longitude'] ', а не' f.variables ['time', 'longitude'] '. Но, как сказал мой предыдущий комментарий, все, что вам нужно, это 'f.variables ['prectot']' (при условии, что я правильно понимаю вас). –

+0

Вижу, я не знал, что на самом деле сделал MFDataset. Я пробовал функцию glob.glob, но только что составил список всех моих файлов. Благодарю. – BBHuggin

ответ

4

Как упоминалось @CharlieZender, ncra - это путь сюда, и я расскажу подробнее об интеграции этой функции в скрипт Python. (PS - Вы можете установить NCO легко с Homebrew, например http://alejandrosoto.net/blog/2014/01/22/setting-up-my-mac-for-scientific-research/)

import subprocess 
import netCDF4 
import glob 
import numpy as np 

for month in range(1,13): 
    # Gather all the files for this month 
    month_files = glob.glob('/path/to/files/*{0:0>2d}.SUB.nc'.format(month)) 


    # Using NCO functions --------------- 
    avg_file = './precip_avg_{0:0>2d}.nc'.format(month) 

    # Concatenate the files using ncrcat 
    subprocess.call(['ncrcat'] + month_files + ['-O', avg_file]) 

    # Take the time (record) average using ncra 
    subprocess.call(['ncra', avg_file, '-O', avg_file]) 

    # Read in the monthly precip climatology file and do whatever now 
    ncfile = netCDF4.Dataset(avg_file, 'r') 
    pr = ncfile.variables['prectot'][:,:,:] 
    .... 

    # Using only Python ------------- 
    # Initialize an array to store monthly-mean precip for all years 
    # let's presume we know the lat and lon dimensions (nlat, nlon) 
    nyears = len(month_files) 
    pr_arr = np.zeros([nyears,nlat,nlon], dtype='f4') 

    # Populate pr_arr with each file's monthly-mean precip 
    for idx, filename in enumerate(month_files): 
     ncfile = netCDF4.Dataset(filename, 'r') 
     pr = ncfile.variable['prectot'][:,:,:] 
     pr_arr[idx,:,:] = np.mean(pr, axis=0) 
     ncfile.close() 

    # Take the average along all years for a monthly climatology 
    pr_clim = np.mean(pr_arr, axis=0) # 2D now [lat,lon] 
+0

Есть ли другой способ работать с этими данными, кроме NCO? – BBHuggin

+0

Вы можете использовать чистый Python для достижения того же результата, NCO просто помогает сжать требования времени/памяти. Я отредактирую свой ответ, чтобы показать вам, как использовать только Python. – N1B4

+0

Две вещи: одна, петля для цикла в течение месяца в диапазоне (1,13): «принимает только файлы месяца в декабре. При изменении диапазона от 1,13 до 1,12 он берет только файлы ноябрьского месяца. Будет ли другой для петли выше кулака позаботиться об этом вопросе? Во-вторых, как только я попадаю в цикл «populate pr_arr», ему не нравится pr_arr [idx,:,:] = np.mean (pr, axis = 0), говорящий: «ValueError: не может передавать входной массив из формы (5 , 5) в форму (0,0) ". Другой вопрос: что делает «{0: 0> 2d}» на самом деле? – BBHuggin

2

NCO делает это с

ncra *.01.SUB.nc pcp_avg_01.nc 
ncra *.02.SUB.nc pcp_avg_02.nc 
... 
ncra *.12.SUB.nc pcp_avg_12.nc 
ncrcat pcp_avg_??.nc pcp_avg.nc 

Конечно первые двенадцать команд может быть сделано с помощью цикла Bash, снижая общее количество линий менее пяти. Если вы предпочитаете сценарий с помощью python, вы можете проверить свои ответы с этим. ncra docs here.

+0

Я использую Enthought Canopy для python, и я не смог найти или загрузить пакет NCO, чтобы получить функцию ncra. Я бы хотел использовать его. – BBHuggin

+1

Инструкции по установке NCO находятся по адресу http: //nco.sf.net#binaries –

+0

Я установил NCO, я думаю. когда я запускаю ncra * 01.SUB.nc pcp_avg_01.nc, он выводит {SyntaxError: недопустимый синтаксис ncra * 01.SUB.nc pcp_avg_01.nc}, а Caret указывает на S в SUB.nc, не уверен, как это исправить. – BBHuggin

0

Команда ymonmean вычисляет среднее календарных месяцев в CDO. Таким образом, задача может быть выполнена в двух направлениях:

cdo mergetime data*.SUB.nc merged.nc # put files together into one series 
cdo ymonmean merged.nc annual_cycle.nC# mean of all Jan,Feb etc. 

CDO можно также рассчитать годовой цикл других статистических данных, ymonstd, ymonmax и т.д ... и единицы времени могут быть дни или пентад, а также месяцев. (например, ydaymean).