Source code for NEDAS.models.nextsim.dg.slicing_nc
"""
"""
from datetime import datetime
import cftime
import netCDF4
import numpy as np
[docs]
def copy_group(src_group, dst_group, time_index, time_dimension_name, time) -> None:
"""
Recursively copy a netCDF group, including dimensions, variables, and attributes.
"""
# Copy global (or group) attributes
dst_group.setncatts(src_group.__dict__)
# Copy dimensions
for name, dimension in src_group.dimensions.items():
dst_group.createDimension(name, len(dimension) if not dimension.isunlimited() else None)
# Copy variables
for name, variable in src_group.variables.items():
# Create the variable in the destination group
dst_var = dst_group.createVariable(name, variable.datatype, variable.dimensions)
dst_var.setncatts({k: variable.getncattr(k) for k in variable.ncattrs()})
if len(variable.dimensions) == 0:
if name == 'formatted':
dst_var[0] = time.strftime(dst_var.format)
if name == 'time':
dst_var[0] = cftime.date2num(time, dst_var.units)
continue
# Copy the data, considering the time slice if relevant
if time_dimension_name in variable.dimensions:
# For other time-dependent variables, copy the time slice
slice_spec = [time_index if dim == time_dimension_name else slice(None) for dim in variable.dimensions]
dst_var[:] = variable[tuple(slice_spec)]
else:
# For time-independent variables, copy all data
dst_var[:] = variable[:]
# Recursively copy groups
for group_name in src_group.groups:
src_subgroup = src_group.groups[group_name]
dst_subgroup = dst_group.createGroup(group_name)
copy_group(src_subgroup, dst_subgroup, time_index, time_dimension_name, time)
[docs]
def copy_time_sliced_nc_file(source_file:str, target_file,
time_index:np.ndarray,
time_varname:str,
time:datetime) -> None:
# Open the source netCDF file in read mode
with netCDF4.Dataset(source_file, 'r') as src:
# Open the target netCDF file in write mode
with netCDF4.Dataset(target_file, 'w') as dst:
# Copy the root group (dimensions, variables, and groups)
time_dimension_name = src[time_varname].dimensions[0]
copy_group(src, dst, time_index, time_dimension_name, time)
dst.sync()
if __name__ == '__main__':
copy_time_sliced_nc_file('/bettik/yumengch-ext/DATA/25km_NH.TOPAZ4_2010-01-01_2011-01-01.nc',
'test.nc', np.arange(2), time_varname='time', time=datetime(2010,1,1))