{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Time format in netcdf files\n", "## Представление времени в файлах netcdf\n", "\n", "#### Автор: Шабанов П.А.\n", "#### E-mail: pa.shabanov@gmail.com\n", "#### Blog: geofortran.blogspot.com\n", "\n", "13:43 15.05.2015\n", "\n", "### Аннотация:\n", "\n", "В данном сообщении будет показано как представить ифнормацию о времени из файлов netcdf в наглядном виде.\n", "\n", "-------------------------------------\n", "\n", "Обычно время (time) является одним из самых востребованных измерений (dimension) при работе с netcdf файлами. Удобно именно время делать осью без ограничений по длине (unlimited). Но в отличие от переменных (солёность, температура, давление и др.), формат времени по умолчанию далёк от привычного ГОД-МЕСЯЦ-ДЕНЬ-ЧАС-МИН-СЕК. \n", "\n", "В netcdf отсчёты времени ведутся от некоторой довольно далёкой от нас даты, в примере это будет 1800 год. Шаг по времени зависит от временного разрешения данных, в примере это 1 час. Обычное значение переменной времени выглядит примерно так: 1498761. Сразу непонятно какая именно это дата.\n", "\n", "Для преобразования временного формата из файла netcdf воспользуемся модулем netCDF4, а именно функцией num2date из него. Эта функция берёт на вход массив значений времени t и параметр units, который представляет собой строку. Информацию об этой строке можно взять прямо из файла с помощью метода units, который есть у ПЕРЕМЕННОЙ \"Время\" (times).\n", "\n", "В качестве исходного netcdf файла был взят файл формата netcdf4 из реанализа NCEP/NCAR I.\n", "\n", "-------------------------------------\n", "\n", "**Электронные ресурсы**:\n", "\n", "+[Реанализ NCEP/NCAR I](http://www.esrl.noaa.gov/psd/data/gridded/data.nmc.reanalysis.html)\n", "\n", "+[Описание](https://docs.python.org/2/library/datetime.html#module-datetime) модуля datetime.\n", "\n", "--------------------------------------\n", "\n", "**Ключевые слова:** #python, #scipy, #datetime, #netcdftime, #netcdf" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "C:\\Users\\SHABA\\Documents\\GitHub\\rus_numpy_scipy\n", "\n", "float32 hgt(time, level, lat, lon)\n", " long_name: Monthly mean geopotential height\n", " valid_range: [ -700. 35000.]\n", " units: m\n", " add_offset: 0.0\n", " scale_factor: 1.0\n", " missing_value: -9.96921e+36\n", " precision: 0\n", " least_significant_digit: 0\n", " GRIB_id: 7\n", " GRIB_name: HGT\n", " var_desc: Geopotential height\n", " dataset: CDC Derived NCEP Reanalysis Products\n", " level_desc: Multiple levels\n", " statistic: Mean\n", " parent_stat: Other\n", " actual_range: [ -334.5161438 32321.09765625]\n", "unlimited dimensions: time\n", "current shape = (804, 17, 73, 144)\n", "filling on, default _FillValue of 9.96920996839e+36 used\n", "\n", "\n", "float64 time(time)\n", " long_name: Time\n", " delta_t: 0000-01-00 00:00:00\n", " avg_period: 0000-01-00 00:00:00\n", " prev_avg_period: 0000-00-01 00:00:00\n", " standard_name: time\n", " axis: T\n", " units: hours since 1800-01-01 00:00:0.0\n", " actual_range: [ 1297320. 1883904.]\n", "unlimited dimensions: time\n", "current shape = (804,)\n", "filling on, default _FillValue of 9.96920996839e+36 used\n", "\n", "Тип массива dates \n", "0 1948-01-01 00:00:00\n", "1 1948-02-01 00:00:00\n", "2 1948-03-01 00:00:00\n", "3 1948-04-01 00:00:00\n", "4 1948-05-01 00:00:00\n", "5 1948-06-01 00:00:00\n", "6 1948-07-01 00:00:00\n", "7 1948-08-01 00:00:00\n", "8 1948-09-01 00:00:00\n", "9 1948-10-01 00:00:00\n", "Временная запись N 0:\n", "----------------------\n", "Год 1948\n", "Месяц 1\n", "День 1\n", "Час 0\n", "Секунда 0\n" ] } ], "source": [ "import os\n", "\n", "import numpy as np\n", "from matplotlib import rcParams\n", "import netCDF4 as nc\n", "from netCDF4 import num2date\n", "\n", "\n", "pwd = os.getcwd()\n", "os.chdir(u'D://NCDATA//ncep_ncar_I//monthly//')\n", "print pwd\n", "\n", "param = 'hgt'\n", "fname = 'mon.mean.nc'\n", "ncname = '%s.%s' % (param, fname)\n", "ncfile = nc.Dataset(ncname, 'r')\n", "os.chdir(pwd)\n", "\n", "# ****************************************\n", "\n", "# Это переменная \"Время\"\n", "times = ncfile.variables['time']\n", "# Это значения переменной \"Время\"\n", "t = ncfile.variables['time'][:]\n", "\n", "v = ncfile.variables[param][:]\n", "print(ncfile.variables[param])\n", "\n", "print(ncfile.variables['time'])\n", "dates = num2date(times[:], units=times.units)\n", "print (u'Тип массива dates %s' % type(dates[0]))\n", "\n", "\n", "for i in range(10):\n", " print ('%d %s' % (i, dates[i]))\n", " \n", "i = 0\n", "print (u'Временная запись N %d:' % (i))\n", "print ('----------------------')\n", "print (u'Год %d' % dates[i].year)\n", "print (u'Месяц %d' % dates[i].month)\n", "print (u'День %d' % dates[i].day)\n", "print (u'Час %d' % dates[i].hour)\n", "print (u'Секунда %d' % dates[i].second)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Функция num2date возвращает список, состоящий из объектов типа datetime.datetime, у котрого есть методы year, month, dat, hour, second. Обращаясь к каждой записи datetime с соответствующим методом можно получить представление даты в наглядном виде - в виде числа или строки.\n", "\n", "Оформив часть кода в виде функции можно автоматизированно переводить время из внутреннего формата netcdf в удобный пользователю вид. Например, это можно сделать так:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "C:\\Users\\SHABA\\Documents\\GitHub\\rus_numpy_scipy\n", "\n", "float64 time(time)\n", " long_name: Time\n", " delta_t: 0000-01-00 00:00:00\n", " avg_period: 0000-01-00 00:00:00\n", " prev_avg_period: 0000-00-01 00:00:00\n", " standard_name: time\n", " axis: T\n", " units: hours since 1800-01-01 00:00:0.0\n", " actual_range: [ 1297320. 1883904.]\n", "unlimited dimensions: time\n", "current shape = (804,)\n", "filling on, default _FillValue of 9.96920996839e+36 used\n", "\n", "(804L, 3L)\n", "[[1948 1 1]\n", " [1948 2 1]\n", " [1948 3 1]\n", " [1948 4 1]\n", " [1948 5 1]\n", " [1948 6 1]\n", " [1948 7 1]\n", " [1948 8 1]\n", " [1948 9 1]\n", " [1948 10 1]\n", " [1948 11 1]\n", " [1948 12 1]\n", " [1949 1 1]\n", " [1949 2 1]\n", " [1949 3 1]\n", " [1949 4 1]\n", " [1949 5 1]\n", " [1949 6 1]\n", " [1949 7 1]\n", " [1949 8 1]]\n", "Первый год 1948\n", "Последний год 2014\n" ] } ], "source": [ "import os\n", "\n", "import numpy as np\n", "from matplotlib import rcParams\n", "import netCDF4 as nc\n", "from netCDF4 import num2date\n", "\n", "\n", "def date2arr(date):\n", " year = int(date.year)\n", " month = int(date.month)\n", " day = int(date.day)\n", " dlist = [year, month, day]\n", " return dlist\n", "\n", "pwd = os.getcwd()\n", "os.chdir(u'D://NCDATA//ncep_ncar_I//monthly//')\n", "print pwd\n", "\n", "param = 'hgt'\n", "fname = 'mon.mean.nc'\n", "ncname = '%s.%s' % (param, fname)\n", "ncfile = nc.Dataset(ncname, 'r')\n", "os.chdir(pwd)\n", "\n", "# ****************************************\n", "\n", "# Это переменная \"Время\"\n", "times = ncfile.variables['time']\n", "# Это значения переменной \"Время\"\n", "t = ncfile.variables['time'][:]\n", "\n", "\n", "print(ncfile.variables['time'])\n", "\n", "dates = num2date(times[:], units=times.units)\n", "\n", "figs = map(date2arr, dates)\n", "figs = np.array(figs, dtype='int')\n", "print (np.shape(figs))\n", "print u'Первый год', figs[0, 0]\n", "print u'Последний год', figs[-1, 0]\n", "print figs[0:20]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Таким образом, дата 1498761 из примера выше - это 09:00 24.12.1970. Просто и наглядно." ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1970-12-24 09:00:00\n" ] } ], "source": [ "from netCDF4 import num2date\n", "\n", "units = 'hours since 1800-01-01 00:00:0.0'\n", "idate = num2date(1498761, units)\n", "print str(idate)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.8" } }, "nbformat": 4, "nbformat_minor": 0 }