#!/usr/bin/env python # coding: utf-8 # # Time format in netcdf files # ## Представление времени в файлах netcdf # # #### Автор: Шабанов П.А. # #### E-mail: pa.shabanov@gmail.com # #### Blog: geofortran.blogspot.com # # 13:43 15.05.2015 # # ### Аннотация: # # В данном сообщении будет показано как представить ифнормацию о времени из файлов netcdf в наглядном виде. # # ------------------------------------- # # Обычно время (time) является одним из самых востребованных измерений (dimension) при работе с netcdf файлами. Удобно именно время делать осью без ограничений по длине (unlimited). Но в отличие от переменных (солёность, температура, давление и др.), формат времени по умолчанию далёк от привычного ГОД-МЕСЯЦ-ДЕНЬ-ЧАС-МИН-СЕК. # # В netcdf отсчёты времени ведутся от некоторой довольно далёкой от нас даты, в примере это будет 1800 год. Шаг по времени зависит от временного разрешения данных, в примере это 1 час. Обычное значение переменной времени выглядит примерно так: 1498761. Сразу непонятно какая именно это дата. # # Для преобразования временного формата из файла netcdf воспользуемся модулем netCDF4, а именно функцией num2date из него. Эта функция берёт на вход массив значений времени t и параметр units, который представляет собой строку. Информацию об этой строке можно взять прямо из файла с помощью метода units, который есть у ПЕРЕМЕННОЙ "Время" (times). # # В качестве исходного netcdf файла был взят файл формата netcdf4 из реанализа NCEP/NCAR I. # # ------------------------------------- # # **Электронные ресурсы**: # # +[Реанализ NCEP/NCAR I](http://www.esrl.noaa.gov/psd/data/gridded/data.nmc.reanalysis.html) # # +[Описание](https://docs.python.org/2/library/datetime.html#module-datetime) модуля datetime. # # -------------------------------------- # # **Ключевые слова:** #python, #scipy, #datetime, #netcdftime, #netcdf # In[1]: import os import numpy as np from matplotlib import rcParams import netCDF4 as nc from netCDF4 import num2date pwd = os.getcwd() os.chdir(u'D://NCDATA//ncep_ncar_I//monthly//') print pwd param = 'hgt' fname = 'mon.mean.nc' ncname = '%s.%s' % (param, fname) ncfile = nc.Dataset(ncname, 'r') os.chdir(pwd) # **************************************** # Это переменная "Время" times = ncfile.variables['time'] # Это значения переменной "Время" t = ncfile.variables['time'][:] v = ncfile.variables[param][:] print(ncfile.variables[param]) print(ncfile.variables['time']) dates = num2date(times[:], units=times.units) print (u'Тип массива dates %s' % type(dates[0])) for i in range(10): print ('%d %s' % (i, dates[i])) i = 0 print (u'Временная запись N %d:' % (i)) print ('----------------------') print (u'Год %d' % dates[i].year) print (u'Месяц %d' % dates[i].month) print (u'День %d' % dates[i].day) print (u'Час %d' % dates[i].hour) print (u'Секунда %d' % dates[i].second) # Функция num2date возвращает список, состоящий из объектов типа datetime.datetime, у котрого есть методы year, month, dat, hour, second. Обращаясь к каждой записи datetime с соответствующим методом можно получить представление даты в наглядном виде - в виде числа или строки. # # Оформив часть кода в виде функции можно автоматизированно переводить время из внутреннего формата netcdf в удобный пользователю вид. Например, это можно сделать так: # In[13]: import os import numpy as np from matplotlib import rcParams import netCDF4 as nc from netCDF4 import num2date def date2arr(date): year = int(date.year) month = int(date.month) day = int(date.day) dlist = [year, month, day] return dlist pwd = os.getcwd() os.chdir(u'D://NCDATA//ncep_ncar_I//monthly//') print pwd param = 'hgt' fname = 'mon.mean.nc' ncname = '%s.%s' % (param, fname) ncfile = nc.Dataset(ncname, 'r') os.chdir(pwd) # **************************************** # Это переменная "Время" times = ncfile.variables['time'] # Это значения переменной "Время" t = ncfile.variables['time'][:] print(ncfile.variables['time']) dates = num2date(times[:], units=times.units) figs = map(date2arr, dates) figs = np.array(figs, dtype='int') print (np.shape(figs)) print u'Первый год', figs[0, 0] print u'Последний год', figs[-1, 0] print figs[0:20] # Таким образом, дата 1498761 из примера выше - это 09:00 24.12.1970. Просто и наглядно. # In[16]: from netCDF4 import num2date units = 'hours since 1800-01-01 00:00:0.0' idate = num2date(1498761, units) print str(idate)