将 Fill_Value 插入 R 中的 nc 文件
Insert Fill_Value to nc file in R
我正在尝试将 .nc
文件转换为 .csv
文件以便在 R 中进行进一步分析,因为我习惯于使用 .csv
。
基本上我认为要解决我的问题(下面有更多详细信息),我需要将 _FillValue
添加到 .nc
文件中,但我尝试过的所有方法都不起作用。
我已经按照 http://geog.uoregon.edu/bartlein/courses/geog490/week04-netCDF.html#replace-netcdf-fillvalues-with-r-nas 中采取的步骤成功地为许多 .nc
文件做到了这一点,直到第 3.4.3 节。
但是,我最近获得了对另一个 .nc
文件的访问权限,但同一过程无法正常工作。我想我已经将范围缩小到新 .nc
文件中没有 _FillValue
的事实。
看起来 _FillValue
应该是 "9.97e+36"。我尝试使用
添加此数字作为缺失值
ncin <- nc_open(ncfname, write=T)
dname <- "tas"
Mvalue <- 9.97e+36
ncvar_change_missval(ncin, dname, Mvalue)
这似乎是将 missing_value:9.97e+36
添加到 .nc
文件中。但是,当我 运行: tmp_array <- ncvar_get(ncin,dname)
时 tmp_array 仍然有 9.97e+36。
我希望 tmp_array 已经将 9.97e+36 替换为 NA
,就像它对它工作的文件所做的那样。
有没有一种方法可以将 _FillValue 添加到我的文件中,以便它用 NA
替换这些值?
如果需要,这是无法工作的文件的信息:
> print(ncin)
File ./data/UKCP18/Mean_air_temperature_(tas)/.nc_files/tas_hadukgrid_uk_1km_mon_201801-201812.nc (NC_FORMAT_NETCDF4):
9 variables (excluding dimension variables):
double tas[projection_x_coordinate,projection_y_coordinate,time] (Contiguous storage)
standard_name: air_temperature
long_name: Mean air temperature
units: degC
description: Mean air temperature
label_units: C
level: 1.5m
plot_label: Mean air temperature at 1.5m (C)
cell_methods: time: mid_range within days time: mean over days
grid_mapping: transverse_mercator
coordinates: latitude longitude month_number season_year
missing_value: 9.97e+36
int transverse_mercator[] (Contiguous storage)
grid_mapping_name: transverse_mercator
longitude_of_prime_meridian: 0
semi_major_axis: 6377563.396
semi_minor_axis: 6356256.909
longitude_of_central_meridian: -2
latitude_of_projection_origin: 49
false_easting: 4e+05
false_northing: -1e+05
scale_factor_at_central_meridian: 0.9996012717
double time_bnds[bnds,time] (Contiguous storage)
double projection_y_coordinate_bnds[bnds,projection_y_coordinate] (Contiguous storage)
double projection_x_coordinate_bnds[bnds,projection_x_coordinate] (Contiguous storage)
8 byte int month_number[time] (Contiguous storage)
units: 1
long_name: month_number
8 byte int season_year[time] (Contiguous storage)
units: 1
long_name: season_year
double latitude[projection_x_coordinate,projection_y_coordinate] (Contiguous storage)
units: degrees_north
standard_name: latitude
double longitude[projection_x_coordinate,projection_y_coordinate] (Contiguous storage)
units: degrees_east
standard_name: longitude
4 dimensions:
time Size:12
axis: T
bounds: time_bnds
units: hours since 1800-01-01 00:00:00
standard_name: time
calendar: gregorian
projection_y_coordinate Size:1450
axis: Y
bounds: projection_y_coordinate_bnds
units: m
standard_name: projection_y_coordinate
projection_x_coordinate Size:900
axis: X
bounds: projection_x_coordinate_bnds
units: m
standard_name: projection_x_coordinate
bnds Size:2
11 global attributes:
_NCProperties: version=1|netcdflibversion=4.6.1|hdf5libversion=1.10.2
comment: Monthly resolution gridded climate observations
creation_date: 2019-08-09T20:34:33
frequency: mon
institution: Met Office
references: doi: 10.1002/joc.1161
short_name: monthly_meantemp
source: HadUK-Grid_v1.0.1.0
title: Gridded surface climate observations data for the UK
version: v20190808
Conventions: CF-1.5
我找到了灵魂。我想我会 post 到这里来,以防有人发现自己也被困住了!
我意识到也许 missing_value
不仅仅是 9.97e+36
,而是有更多的小数点。我 运行 这是为了找出完整的 missing_value
然后我将其设置为 missing_value
所以 ncvar_get()
工作正确。
ncin <- nc_open(ncfname, write=T)
print(ncin)
tmp_array <- ncvar_get(ncin,dname) # This produced an array with the missing value inserted - should be replaced with NAs
# What is the missing value up to 100 decimal points?!
sprintf("%.100f", tmp_array[1,1,1])
# Set missing value
Mvalue <- 9.969209968386869047442886268468442020e+36
# insert missing_value to .nc file
ncvar_change_missval(ncin, dname, Mvalue)
print(ncin)
# make new array with values replaced with NAs
tmp_array <- ncvar_get(ncin,dname)
然后我继续按照 http://geog.uoregon.edu/bartlein/courses/geog490/week04-netCDF.html#replace-netcdf-fillvalues-with-r-nas 中概述的过程直到 3.4.3 生成我的 .csv
呸!谢谢大家:)
我正在尝试将 .nc
文件转换为 .csv
文件以便在 R 中进行进一步分析,因为我习惯于使用 .csv
。
基本上我认为要解决我的问题(下面有更多详细信息),我需要将 _FillValue
添加到 .nc
文件中,但我尝试过的所有方法都不起作用。
我已经按照 http://geog.uoregon.edu/bartlein/courses/geog490/week04-netCDF.html#replace-netcdf-fillvalues-with-r-nas 中采取的步骤成功地为许多 .nc
文件做到了这一点,直到第 3.4.3 节。
但是,我最近获得了对另一个 .nc
文件的访问权限,但同一过程无法正常工作。我想我已经将范围缩小到新 .nc
文件中没有 _FillValue
的事实。
看起来 _FillValue
应该是 "9.97e+36"。我尝试使用
ncin <- nc_open(ncfname, write=T)
dname <- "tas"
Mvalue <- 9.97e+36
ncvar_change_missval(ncin, dname, Mvalue)
这似乎是将 missing_value:9.97e+36
添加到 .nc
文件中。但是,当我 运行: tmp_array <- ncvar_get(ncin,dname)
时 tmp_array 仍然有 9.97e+36。
我希望 tmp_array 已经将 9.97e+36 替换为 NA
,就像它对它工作的文件所做的那样。
有没有一种方法可以将 _FillValue 添加到我的文件中,以便它用 NA
替换这些值?
如果需要,这是无法工作的文件的信息:
> print(ncin)
File ./data/UKCP18/Mean_air_temperature_(tas)/.nc_files/tas_hadukgrid_uk_1km_mon_201801-201812.nc (NC_FORMAT_NETCDF4):
9 variables (excluding dimension variables):
double tas[projection_x_coordinate,projection_y_coordinate,time] (Contiguous storage)
standard_name: air_temperature
long_name: Mean air temperature
units: degC
description: Mean air temperature
label_units: C
level: 1.5m
plot_label: Mean air temperature at 1.5m (C)
cell_methods: time: mid_range within days time: mean over days
grid_mapping: transverse_mercator
coordinates: latitude longitude month_number season_year
missing_value: 9.97e+36
int transverse_mercator[] (Contiguous storage)
grid_mapping_name: transverse_mercator
longitude_of_prime_meridian: 0
semi_major_axis: 6377563.396
semi_minor_axis: 6356256.909
longitude_of_central_meridian: -2
latitude_of_projection_origin: 49
false_easting: 4e+05
false_northing: -1e+05
scale_factor_at_central_meridian: 0.9996012717
double time_bnds[bnds,time] (Contiguous storage)
double projection_y_coordinate_bnds[bnds,projection_y_coordinate] (Contiguous storage)
double projection_x_coordinate_bnds[bnds,projection_x_coordinate] (Contiguous storage)
8 byte int month_number[time] (Contiguous storage)
units: 1
long_name: month_number
8 byte int season_year[time] (Contiguous storage)
units: 1
long_name: season_year
double latitude[projection_x_coordinate,projection_y_coordinate] (Contiguous storage)
units: degrees_north
standard_name: latitude
double longitude[projection_x_coordinate,projection_y_coordinate] (Contiguous storage)
units: degrees_east
standard_name: longitude
4 dimensions:
time Size:12
axis: T
bounds: time_bnds
units: hours since 1800-01-01 00:00:00
standard_name: time
calendar: gregorian
projection_y_coordinate Size:1450
axis: Y
bounds: projection_y_coordinate_bnds
units: m
standard_name: projection_y_coordinate
projection_x_coordinate Size:900
axis: X
bounds: projection_x_coordinate_bnds
units: m
standard_name: projection_x_coordinate
bnds Size:2
11 global attributes:
_NCProperties: version=1|netcdflibversion=4.6.1|hdf5libversion=1.10.2
comment: Monthly resolution gridded climate observations
creation_date: 2019-08-09T20:34:33
frequency: mon
institution: Met Office
references: doi: 10.1002/joc.1161
short_name: monthly_meantemp
source: HadUK-Grid_v1.0.1.0
title: Gridded surface climate observations data for the UK
version: v20190808
Conventions: CF-1.5
我找到了灵魂。我想我会 post 到这里来,以防有人发现自己也被困住了!
我意识到也许 missing_value
不仅仅是 9.97e+36
,而是有更多的小数点。我 运行 这是为了找出完整的 missing_value
然后我将其设置为 missing_value
所以 ncvar_get()
工作正确。
ncin <- nc_open(ncfname, write=T)
print(ncin)
tmp_array <- ncvar_get(ncin,dname) # This produced an array with the missing value inserted - should be replaced with NAs
# What is the missing value up to 100 decimal points?!
sprintf("%.100f", tmp_array[1,1,1])
# Set missing value
Mvalue <- 9.969209968386869047442886268468442020e+36
# insert missing_value to .nc file
ncvar_change_missval(ncin, dname, Mvalue)
print(ncin)
# make new array with values replaced with NAs
tmp_array <- ncvar_get(ncin,dname)
然后我继续按照 http://geog.uoregon.edu/bartlein/courses/geog490/week04-netCDF.html#replace-netcdf-fillvalues-with-r-nas 中概述的过程直到 3.4.3 生成我的 .csv
呸!谢谢大家:)