Вставить Fill_Value в файл nc в R - PullRequest
       30

Вставить Fill_Value в файл nc в R

0 голосов
/ 29 октября 2019

Я пытаюсь преобразовать файл .nc в файл .csv для дальнейшего анализа в R, так как я привык работать с .csv.

В основном я думаю, что решил свою проблему (подробнееподробности ниже) Мне нужно добавить _FillValue в файл .nc, но все, что я пробовал, не работает.

Мне удалось сделать это для многих файлов .nc, следуя шагам, предпринятым в http://geog.uoregon.edu/bartlein/courses/geog490/week04-netCDF.html#replace-netcdf-fillvalues-with-r-nas вплоть до раздела 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

1 Ответ

0 голосов
/ 30 октября 2019

Я нашел душу. Я думал, что отправлю сюда, если кто-нибудь тоже застрянет!

Я понял, что, возможно, 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

Фу! Спасибо всем:)

...