Краткое руководство
Чтение файла
Вероятно, самая распространенная задача — это просто считывание файла NetCDF в память. Делается это так:
ncread(filename, varname)
Данный вызов считывает всю переменную в память и возвращает ее в виде массива Julia. Для считывания среза файла NetCDF есть необязательные именованные аргументы start
и count
, в которых можно указать начальный индекс и количество элементов по каждому измерению.
Более сложный пример
В этом примере показано, как создать файл NetCDF с нуля, записать в него данные, а затем прочесть их. Сначала мы создаем массив с данными по радиации в верхних слоях атмосферы:
using NetCDF
include(joinpath(dirname(pathof(NetCDF)), "../examples/toa.jl"))
# Определяем долготу и широту, день и временные шаги
lat = collect(-89.5:89.5)
lon = collect(-179.5:179.5)
day = 1
tim = collect(0:23)
# Создаем массив с данными по радиации
rad = [g_pot(x2,x1,day,x3) for x1=lon, x2=lat, x3=tim];
360×180×24 Array{Float64, 3}:
[:, :, 1] =
569.246 591.944 614.461 636.791 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.245 591.941 614.456 636.784 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.241 591.927 614.434 636.753 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.233 591.904 614.394 636.698 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.221 591.87 614.337 636.618 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.206 591.825 614.263 636.514 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.188 591.77 614.171 636.386 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.166 591.704 614.062 636.233 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.141 591.629 613.936 636.056 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.112 591.542 613.792 635.856 0.0 0.0 0.0 0.0 0.0 0.0 0.0
⋮ ⋱ ⋮
569.098 591.5 613.722 635.757 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.128 591.591 613.873 635.969 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.155 591.671 614.007 636.156 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.179 591.742 614.124 636.32 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.199 591.801 614.224 636.459 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.215 591.851 614.306 636.574 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.228 591.89 614.371 636.665 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.237 591.918 614.418 636.731 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.243 591.936 614.448 636.773 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[:, :, 2] =
568.868 590.81 612.572 634.147 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.815 590.652 612.309 633.779 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.76 590.484 612.029 633.388 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.7 590.307 611.733 632.973 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.638 590.119 611.42 632.535 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.572 589.921 611.091 632.074 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.503 589.714 610.745 631.591 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.43 589.497 610.383 631.084 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.355 589.27 610.005 630.555 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.276 589.033 609.611 630.003 0.0 0.0 0.0 0.0 0.0 0.0 0.0
⋮ ⋱ ⋮
569.188 591.77 614.171 636.386 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.166 591.704 614.062 636.233 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.141 591.629 613.936 636.056 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.112 591.542 613.792 635.856 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.08 591.446 613.632 635.631 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.045 591.339 613.454 635.381 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.006 591.222 613.259 635.109 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.963 591.095 613.047 634.812 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.917 590.957 612.818 634.491 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[:, :, 3] =
567.737 587.416 606.916 626.231 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.636 587.114 606.413 625.527 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.532 586.803 605.895 624.802 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.426 586.483 605.362 624.057 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.316 586.155 604.815 623.291 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.204 585.818 604.253 622.504 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.089 585.472 603.677 621.698 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.97 585.118 603.087 620.872 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.85 584.755 602.482 620.026 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.726 584.384 601.864 619.161 0.0 0.0 0.0 0.0 0.0 0.0 0.0
⋮ ⋱ ⋮
568.503 589.714 610.745 631.591 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.43 589.497 610.383 631.084 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.355 589.27 610.005 630.555 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.276 589.033 609.611 630.003 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.194 588.787 609.201 629.429 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.108 588.531 608.775 628.833 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.02 588.266 608.333 628.215 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.929 587.992 607.876 627.575 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.834 587.708 607.404 626.914 0.0 0.0 0.0 0.0 0.0 0.0 0.0
;;; …
[:, :, 22] =
565.865 581.801 597.56 613.137 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.005 582.222 598.262 614.119 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.143 582.636 598.951 615.084 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.279 583.042 599.628 616.032 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.411 583.441 600.292 616.961 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.542 583.831 600.943 617.872 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.669 584.214 601.581 618.764 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.794 584.588 602.205 619.638 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.916 584.955 602.815 620.492 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.036 585.313 603.412 621.327 0.0 0.0 0.0 0.0 0.0 0.0 0.0
⋮ ⋱ ⋮
564.496 577.694 590.716 603.559 0.0 0.0 0.0 0.0 0.0 0.0 0.0
564.657 578.177 591.521 604.684 0.0 0.0 0.0 0.0 0.0 0.0 0.0
564.815 578.653 592.314 605.795 0.0 0.0 0.0 0.0 0.0 0.0 0.0
564.972 579.123 593.098 606.892 0.0 0.0 0.0 0.0 0.0 0.0 0.0
565.127 579.586 593.87 607.972 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
565.279 580.043 594.631 609.038 0.0 0.0 0.0 0.0 0.0 0.0 0.0
565.429 580.493 595.381 610.087 0.0 0.0 0.0 0.0 0.0 0.0 0.0
565.577 580.936 596.119 611.12 0.0 0.0 0.0 0.0 0.0 0.0 0.0
565.722 581.372 596.845 612.137 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[:, :, 23] =
567.691 587.28 606.69 625.915 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.79 587.577 607.185 626.608 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.886 587.865 607.664 627.279 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.979 588.143 608.128 627.928 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.069 588.413 608.577 628.556 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.156 588.673 609.01 629.162 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.239 588.923 609.427 629.746 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.319 589.164 609.829 630.308 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.396 589.395 610.214 630.848 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.47 589.617 610.584 631.364 0.0 0.0 0.0 0.0 0.0 0.0 0.0
⋮ ⋱ ⋮
566.669 584.214 601.581 618.764 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.794 584.588 602.205 619.638 0.0 0.0 0.0 0.0 0.0 0.0 0.0
566.916 584.955 602.815 620.492 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.036 585.313 603.412 621.327 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.152 585.662 603.994 622.142 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.266 586.003 604.563 622.938 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.377 586.336 605.117 623.713 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.484 586.66 605.656 624.468 0.0 0.0 0.0 0.0 0.0 0.0 0.0
567.589 586.974 606.18 625.202 0.0 0.0 0.0 0.0 0.0 0.0 0.0
[:, :, 24] =
568.845 590.74 612.455 633.983 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.895 590.892 612.708 634.338 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.943 591.034 612.945 634.67 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.987 591.166 613.165 634.977 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.027 591.288 613.368 635.261 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.064 591.399 613.553 635.521 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.098 591.5 613.722 635.757 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.128 591.591 613.873 635.969 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.155 591.671 614.007 636.156 0.0 0.0 0.0 0.0 0.0 0.0 0.0
569.179 591.742 614.124 636.32 0.0 0.0 0.0 0.0 0.0 0.0 0.0
⋮ ⋱ ⋮
568.239 588.923 609.427 629.746 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.319 589.164 609.829 630.308 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.396 589.395 610.214 630.848 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.47 589.617 610.584 631.364 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.541 589.829 610.937 631.859 … 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.608 590.031 611.273 632.33 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.672 590.223 611.594 632.778 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.733 590.405 611.897 633.203 0.0 0.0 0.0 0.0 0.0 0.0 0.0
568.791 590.577 612.184 633.605 0.0 0.0 0.0 0.0 0.0 0.0 0.0
В итоге получается трехмерный массив с измерениями долготы, широты и времени, содержащий примерные почасовые данные по радиации в верхних слоях атмосферы за 1 января. В целях документирования нам нужно добавить атрибуты к переменной и измерениям. В данном пакете атрибуты представлены в виде Dict{String}
:
varatts = Dict("longname" => "Radiation at the top of the atmosphere",
"units" => "W/m^2")
lonatts = Dict("longname" => "Longitude",
"units" => "degrees east")
latatts = Dict("longname" => "Latitude",
"units" => "degrees north")
timatts = Dict("longname" => "Time",
"units" => "hours since 01-01-2000 00:00:00");
Dict{String, String} with 2 entries:
"units" => "hours since 01-01-2000 00:00:00"
"longname" => "Time"
Теперь у нас есть вся необходимая метаинформация для создания самого файла:
fn = joinpath(tempdir(),"radiation.nc")
isfile(fn) && rm(fn)
nccreate(fn,"rad","lon",lon,lonatts,"lat",lat,latatts,"time",tim,timatts,atts=varatts);
После создания файла в него можно записать фактические данные:
ncwrite(rad,fn,"rad");
Теперь предположим, что мы только что получили этот файл NetCDF с данными по радиации и хотим извлечь из него некоторую информацию. Это делается с помощью ncinfo
:
ncinfo(fn)
##### NetCDF File #####
/tmp/radiation.nc
##### Dimensions #####
Name Length
--------------------------------------------------------------------------------
lat 180
time 24
lon 360
##### Variables #####
Name Type Dimensions
--------------------------------------------------------------------------------
lat DOUBLE lat
time INT64 time
lon DOUBLE lon
rad DOUBLE lon lat time
##### Attributes #####
Variable Name Value
--------------------------------------------------------------------------------
lat units degrees north
lat longname Latitude
time units hours since 01-01-2000 00:00:00
time longname Time
lon units degrees east
lon longname Longitude
rad units W/m^2
rad longname Radiation at the top of the atmosphere
Здесь мы получаем наиболее важную информацию о файле, содержащихся в нем переменных, их измерениях и атрибутах. Мы решаем прочесть переменную радиации:
x=ncread(fn,"rad")
size(x)
(360, 180, 24)
Таким образом считывается сразу весь массив. Чтобы прочесть лишь часть переменной, например, если требуется построить временные ряды в определенном месте, можно воспользоваться именованными аргументами start
и count
:
ts = ncread(fn,"rad",start=[180,45,1], count=[1,1,-1])
1×1×24 Array{Float64, 3}:
[:, :, 1] =
0.0
[:, :, 2] =
0.0
[:, :, 3] =
0.0
;;; …
[:, :, 22] =
0.0
[:, :, 23] =
0.0
[:, :, 24] =
0.0
Для правильной маркировки временных шагов мы извлекаем информацию о времени из файла:
using Dates
tvec = DateTime(2001,1,1) + Hour.(ncread(fn,"time"))
24-element Vector{DateTime}:
2001-01-01T00:00:00
2001-01-01T01:00:00
2001-01-01T02:00:00
2001-01-01T03:00:00
2001-01-01T04:00:00
2001-01-01T05:00:00
2001-01-01T06:00:00
2001-01-01T07:00:00
2001-01-01T08:00:00
2001-01-01T09:00:00
⋮
2001-01-01T15:00:00
2001-01-01T16:00:00
2001-01-01T17:00:00
2001-01-01T18:00:00
2001-01-01T19:00:00
2001-01-01T20:00:00
2001-01-01T21:00:00
2001-01-01T22:00:00
2001-01-01T23:00:00
Теперь можно построить график:
plot(tvec,ts)
Еще один пример — построение тепловой карты солнечной радиации в момент времени 00:00 в формате UTC:
lons = ncread(fn,"lon") lats = ncread(fn,"lat") m = ncread(fn,"rad",start=[1,1,12],count=[-1,-1,1]) plot(heatmap(x=lons,y=lats,z=m))