Jan*_*Jan 1 python dimension netcdf python-2.7 netcdf4
有人可以介绍一下如何为 NetCDF 文件创建无限时间维度吗?我尝试使用 data.createDimension('t', None),但是当我查看t它时它是一个 Numpy 数组。如果可以的话,也请介绍一下如何给它赋值。我正在使用Python 2.7。
我有多个 NetCDF 文件(3 维),对于每个文件,我必须计算一个数组(3 维)。文件之间的时间步长为 3 小时。现在我必须使用每个时间步长的计算数组创建一个新的 NetCDF。我的问题是,我不知道如何访问时间轴,以便我可以将计算出的数组分配给不同的时间步。
我想为时间轴分配一个日期。为了创建日期,我datetime像这样使用:
t_start = dt.datetime(1900,1,1)
t_delta = dt.timedelta(hours=3)
Run Code Online (Sandbox Code Playgroud)
两个时间步之间的时间为 3 小时。在循环文件时,时间步的日期计算如下:
t_mom = t_start + i*t_delta
t_mom_str = t_mom.strftime("%d %B %Y %H %M %S")
t_mom_var = netCDF4.stringtochar(np.array([t_mom_str]))
Run Code Online (Sandbox Code Playgroud)
我创建了一个像这样的变量:
time = data.createVariable('time', np.float32, ('time'))
Run Code Online (Sandbox Code Playgroud)
现在我想将日期分配给时间变量:
time[i] = t_mom_var[:]
Run Code Online (Sandbox Code Playgroud)
但事实并非如此。谢谢你的帮助。
使用createDimensionwithNone应该可以:
import netCDF4 as nc4
import numpy as np
f = nc4.Dataset('test.nc', 'w')
# Create the unlimited time dimension:
dim_t = f.createDimension('time', None)
# Create a variable `time` using the unlimited dimension:
var_t = f.createVariable('time', 'int', ('time'))
# Add some values to the variable:
var_t[:] = np.arange(10)
f.close()
Run Code Online (Sandbox Code Playgroud)
结果是 ( ncdump -h test.nc):
netcdf test {
dimensions:
time = UNLIMITED ; // (10 currently)
variables:
int64 time(time) ;
}
Run Code Online (Sandbox Code Playgroud)
对于更新的问题,这是一个关于如何通过添加新的无限维度将多个文件合并为一个的最小工作示例:
import netCDF4 as nc4
import numpy as np
# Lets quickly create 3 NetCDF files with 3 dimensions
for i in range(3):
f = nc4.Dataset('test_{0:1d}.nc'.format(i), 'w')
# Create the 3 dimensions
dim_x = f.createDimension('x', 2)
dim_y = f.createDimension('y', 3)
dim_z = f.createDimension('z', 4)
var_t = f.createVariable('temperature', 'double', ('x','y','z'))
# Add some dummy data
var_t[:,:,:] = np.random.random(2*3*4).reshape(2,3,4)
f.close()
# Now the actual merging:
# Get the dimensions (sizes) from the first file:
f_in = nc4.Dataset('test_0.nc', 'r')
dim_size_x = f_in.dimensions['x'].size
dim_size_y = f_in.dimensions['y'].size
dim_size_z = f_in.dimensions['z'].size
dim_size_t = 3
f_in.close()
# Create new NetCDF file:
f_out = nc4.Dataset('test_merged.nc', 'w')
# Add the dimensions, including an unlimited time dimension:
dim_x = f_out.createDimension('x', dim_size_x)
dim_y = f_out.createDimension('y', dim_size_y)
dim_z = f_out.createDimension('z', dim_size_z)
dim_t = f_out.createDimension('time', None)
# Create new variable with 4 dimensions
var_t = f_out.createVariable('temperature', 'double', ('time','x','y','z'))
# Add the data
for i in range(3):
f_in = nc4.Dataset('test_{0:1d}.nc'.format(i), 'r')
var_t[i,:,:,:] = f_in.variables['temperature'][:,:,:]
f_in.close()
f_out.close()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4803 次 |
| 最近记录: |