如何将netCDF4文件中time变量从float64转为int32?
解决netCDF4中time变量从float64转int32的问题
我来帮你搞定这个问题!你直接赋值没成功的原因很简单:netCDF文件里的变量数据类型是在创建时就固定好的,没法直接修改原有变量的 dtype——你之前的操作只是把数据转成int32后又塞回了原来的float64变量里,最终数据还是会被自动转回float64,相当于白忙活了一场。
下面给你两种靠谱的实现方法,优先推荐第一种:
方法一:创建新的netCDF文件(最安全)
这种方法不会修改原文件,避免数据损坏的风险,步骤是复制原文件的所有内容,只把time变量换成int32类型:
import netCDF4 as nc import numpy as np # 打开原文件并新建目标文件 with nc.Dataset('你的原文件名.nc', 'r') as src_file: with nc.Dataset('转换后的新文件.nc', 'w') as dst_file: # 1. 复制原文件的全局属性 dst_file.setncatts({attr: src_file.getncattr(attr) for attr in src_file.ncattrs()}) # 2. 复制所有维度信息 for dim_name, dim in src_file.dimensions.items(): # 处理无限维度(比如time通常是无限维度) dst_file.createDimension(dim_name, len(dim) if not dim.isunlimited() else None) # 3. 复制除time外的所有变量 for var_name, var in src_file.variables.items(): if var_name != 'time': new_var = dst_file.createVariable(var_name, var.datatype, var.dimensions) # 复制变量的属性(比如单位、描述等) new_var.setncatts({attr: var.getncattr(attr) for attr in var.ncattrs()}) # 复制变量数据 new_var[:] = var[:] # 4. 创建新的time变量,指定类型为i4(对应numpy的int32) time_data = np.int32(src_file.variables['time'][:]) new_time_var = dst_file.createVariable('time', 'i4', src_file.variables['time'].dimensions) # 复制原time变量的属性 new_time_var.setncatts({attr: src_file.variables['time'].getncattr(attr) for attr in src_file.variables['time'].ncattrs()}) # 写入转换后的数据 new_time_var[:] = time_data
方法二:直接修改原文件(慎用)
如果一定要在原文件上修改,需要先删除原time变量,再重新创建类型为int32的time变量。**注意:操作前一定要备份原文件,避免数据丢失!**另外如果time同时是文件的维度变量,这种方法可能会破坏其他依赖该维度的变量,所以只推荐time不是维度的场景:
import netCDF4 as nc import numpy as np # 以读写模式打开原文件 with nc.Dataset('你的原文件名.nc', 'r+') as ds: # 先保存原time变量的数据和属性 time_data = np.int32(ds.variables['time'][:]) time_attrs = {attr: ds.variables['time'].getncattr(attr) for attr in ds.variables['time'].ncattrs()} time_dims = ds.variables['time'].dimensions # 删除原time变量 del ds.variables['time'] # 重新创建类型为i4的time变量 new_time_var = ds.createVariable('time', 'i4', time_dims) # 恢复属性 new_time_var.setncatts(time_attrs) # 写入转换后的数据 new_time_var[:] = time_data
执行完任意一种方法后,你可以用nc.Dataset打开文件,检查ds.variables['time'].datatype,应该会显示为'i4',数据也会是int32类型啦。
内容的提问来源于stack exchange,提问作者skuzmier
相关产品推荐
相关产品推荐

