2016-06-06 14 views
1

Ich werde ein wenig meine Situation erklären: Ich versuche, einige Variablen einer netcdf-Datei zu bearbeiten und schreibe eine neue netcdf-Datei, die mir die neu bearbeiteten Variablen zeigt. Mein Problem ist, dass Variablen zeitabhängig ist, und ich weiß nicht, wie dies in meinem Code enthält:Zeitabhängige Variable in einer netcdf-Datei mit Python definieren

import netCDF4 
import numpy as np 

ncfile = netCDF4.Dataset('toread.nc', 'r') 
u = ncfile.variables['u'][:,:,:] 
v = ncfile.variables['v'][:,:,:] 

nx = np.shape(u)[0] - 1 
ny = np.shape(v)[1] - 1 
nz = np.shape(u)[2] 

u_center = 0.5 * (u[0:nx,:,:] + u[1:nx+1,:,:]) 
v_center = 0.5 * (v[:,0:ny,:] + v[:,1:ny+1,:]) 


ncfile_out = netCDF4.Dataset('./output.nc', 'w') 
ncfile_out.createDimension('longitude', nx) 
ncfile_out.createDimension('latitude', ny) 
ncfile_out.createDimension('level', nz) 
u_out = ncfile_out.createVariable('u_center', 'f4', ('longitude', 'latitude', 'level')) 
v_out = ncfile_out.createVariable('v_center', 'f4', ('longitude', 'latitude', 'level')) 
u_out[:,:,:] = u_center[:,:,:] 
v_out[:,:,:] = v_center[:,:,:] 
ncfile_out.close() 

ich versuchte, dies zu kompilieren, aber es zeigte einen Wert Fehler sprechen über eine Dimension Problem. Ich denke, dass meine Variablen 4D mit Zeitabhängigkeit sind, aber ich weiß nicht, wie ich es definiere und meinen Code beende.

ncdump Info:

netcdf state.global { 
dimensions: 
    T = UNLIMITED ; // (10001 currently) 
    Xp1 = 61 ; 
    Y = 1 ; 
    Z = 20 ; 
    X = 60 ; 
    Yp1 = 2 ; 
    Zl = 20 ; 
variables: 
    double Xp1(Xp1) ; 
     Xp1:long_name = "X-Coordinate of cell corner" ; 
     Xp1:units = "meters" ; 
    double Y(Y) ; 
     Y:long_name = "Y-Coordinate of cell center" ; 
     Y:units = "meters" ; 
    double Z(Z) ; 
     Z:long_name = "vertical coordinate of cell center" ; 
     Z:units = "meters" ; 
     Z:positive = "up" ; 
    double X(X) ; 
     X:long_name = "X-coordinate of cell center" ; 
     X:units = "meters" ; 
    double Yp1(Yp1) ; 
     Yp1:long_name = "Y-Coordinate of cell corner" ; 
     Yp1:units = "meters" ; 
    double Zl(Zl) ; 
     Zl:long_name = "vertical coordinate of upper cell interface" ; 
     Zl:units = "meters" ; 
     Zl:positive = "up" ; 
    double T(T) ; 
     T:long_name = "model_time" ; 
     T:units = "s" ; 
    int iter(T) ; 
     iter:long_name = "iteration_count" ; 
    double U(T, Z, Y, Xp1) ; 
     U:units = "m/s" ; 
     U:coordinates = "XU YU RC iter" ; 
    double V(T, Z, Yp1, X) ; 
     V:units = "m/s" ; 
     V:coordinates = "XV YV RC iter" ; 
    double Temp(T, Z, Y, X) ; 
     Temp:units = "degC" ; 
     Temp:long_name = "potential_temperature" ; 
     Temp:coordinates = "XC YC RC iter" ; 
    double S(T, Z, Y, X) ; 
     S:long_name = "salinity" ; 
     S:coordinates = "XC YC RC iter" ; 
    double Eta(T, Y, X) ; 
     Eta:long_name = "free-surface_r-anomaly" ; 
     Eta:units = "m" ; 
     Eta:coordinates = "XC YC iter" ; 
    double W(T, Zl, Y, X) ; 
     W:units = "m/s" ; 
     W:coordinates = "XC YC RC iter" ; 

// global attributes: 
     :MITgcm_version = "****************" ; 
     :build_user = "************" ; 
     :build_host = "**************" ; 
     :build_date = "*******************" ; 
     :MITgcm_URL = "***************" ; 
     :MITgcm_tag_id = "*******************" ; 
     :MITgcm_mnc_ver = 0.9 ; 
     :sNx = 30 ; 
     :sNy = 1 ; 
     :OLx = 2 ; 
     :OLy = 2 ; 
     :nSx = 2 ; 
     :nSy = 1 ; 
     :nPx = 1 ; 
     :nPy = 1 ; 
     :Nx = 60 ; 
     :Ny = 1 ; 
     :Nr = 20 ; 
} 

Antwort

2

Sie haben eine andere Dimension für die Zeit zu schaffen:

ncfile_out.createDimension('time', nt) # to make time dimension unlimited put None instead of nt 
v_out = ncfile_out.createVariable('v_center', 'f4', ('time', 'longitude', 'latitude', 'level')) 

Dann zusätzliche Array hinzufügen Zeitwerte zu speichern und füllen:

time = ncfile_out.createVariable('Time', 'i4', 'time') 

Aditional Informationen finden Sie hier: http://pyhogs.github.io/intro_netcdf4.html

+0

Ich werde es versuchen. Was ist der Unterschied zwischen ('Zeit') und ('Zeit')? –

+0

Ich denke, es ist egal, weil es nur ein Name ist. Problem ist, dass Ihr Array 3 Dimensionen hat, aber Sie müssen 4d Array schreiben. – Serenity

+0

Wie? Könnten Sie die notwendigen Änderungen veröffentlichen? –

Verwandte Themen