- 最近,在处理nc文件时,在时间上存在部分缺失的数据,为了避免影响后续操作,这里通过复制前一时刻的nc数据进行替代,但是虽然缺失时刻的数据得到了填充,但是填充的数据的时间属性本质上仍然是前一时刻的,为了保证时间的一致性,这里通过一个更新时间的脚本,进行替换。
- 脚本如下,在shell脚本中,需要传递两个参数给该python脚本,一个为需要替换时间的nc文件的完整路径,第二个为替换的时间。
import netCDF4 as nc
import datetime
def update_time_in_ncfile(input_file, new_time):
try:
# Open the NetCDF file in read-write mode
with nc.Dataset(input_file, 'a') as dataset:
# Assuming you have a 'time' variable in the NetCDF file
if 'time' in dataset.variables:
time_var = dataset.variables['time']
# Convert the new time string to a datetime object
new_time_obj = datetime.datetime.strptime(new_time, '%Y%m%d %H%M')
# Convert the datetime object to the units used in the 'time' variable
new_time_units = f"seconds since {new_time_obj.strftime('%Y-%m-%d %H:%M:%S')}"
# Update the time variable's units and values
time_var.units = new_time_units
time_var[:] = [0.0] # You may need to adjust this value depending on the units
# Save the changes
dataset.sync()
print(f"Time in {input_file} updated to {new_time}")
except Exception as e:
print(f"Error updating time in {input_file}: {str(e)}")
if __name__ == "__main__":
input_file = "/Users/test_code/NC_HS_H09_20230620_0110_FLDK_R100.nc" # Replace with the actual input file path
new_time = "20230621 1234" # Replace with the desired new time
update_time_in_ncfile(input_file, new_time)
这里利用shell脚本进行传递,以下是shell脚本的内容,仅提供一个封装好的函数:
process_folder() {
local folder_path=$1
if [[ -d $folder_path ]]; then
echo "Processing files in $folder_path..."
output_file="${temp_nc_path}/NC_HS_H09_${date_str}_${time_str}_FLDK_R100.nc"
if [ ! -f "$output_file" ]; then
/home/software/miniconda/envs/tf-g/bin/python "$convert_script" \
--root_path "$1" \
--temp_path "$temp_path" \
--temp_nc_path "$temp_nc_path" \
--bin_path "$bin_path"\
> "$python_output" 2>&1
if [ $? -ne 0 ]; then
echo "Error processing files in $folder_path. Check $python_output for details."
fi
else
echo "Output file $output_file already exists"
fi
else
echo "Folder $folder_path does not exist. Copying from previous time step..."
output_file="${temp_nc_path}/NC_HS_H09_${date_str}_${time_str}_FLDK_R100.nc"
prev_time_str=$(date -d "$time_str - 10 minutes" "+%H%M")
prev_output_file="${temp_nc_path}/NC_HS_H09_${date_str}_${prev_time_str}_FLDK_R100.nc"
echo "prev_time_str:$prev_time_str prev_output_file:$prev_output_file"
cp "$prev_output_file" "$output_file"
/home/software/miniconda/envs/tf-g/bin/python "/home/gaby/test_run/code/time_up.py" "$output_file" "${date_str} ${time_str}"
fi
}
以上,通过shell脚本与python脚本的结合,初步实现了缺失时刻的nc数据的填充。对于海表面温度(SST)、海面风速等海洋要素特征来说,短时间内变化不那么剧烈,可以采用上述方法;当然,这里展示的只是通过复制前一时刻的数据,也可以通过插值的方法,这就需要额外编写相关的python脚本,然后加到对应的if / else
判断下。