Преобразование набора данных Netcdf из секунд с момента запуска в часы UTC - PullRequest
1 голос
/ 01 октября 2019

Я работаю с кодом формата netcdf, и мне нужно преобразовать время в секундах от времени начала (2016-01-01 00: 00: 00.0) во время в UTC. Я довольно новичок во всем этом, поэтому я действительно борюсь!

Я пытался использовать num2date из netCDF4.

from netCDF4 import date2num , num2date, Dataset
time=f.variables['time'][:]
dates=netCDF4.num2date(time[:],time.units)
print(dates.strftime('%Y%m%d%H') for date in dates)

AttributeError: объект 'MaskedArray' не имеет атрибута 'units'

1 Ответ

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

Поскольку вы извлекаете time из переменных в time=f.variables['time'][:], он потеряет связанную с ним единицу (время, как говорится в ошибке, является просто замаскированным массивом). То, что вам нужно указать num2date(), это variables['time'].units, например,

from netCDF4 import date2num, num2date, Dataset
file = ... # your nc file

with Dataset(file) as root:
    time = root.variables['time'][:]
    dates = num2date(time, root.variables['time'].units)
    ## directly get UTC hours here:
    # unit_utchours = root.variables['time'].units.replace('seconds', 'hours')
    ## would e.g. be 'hours since 2019-08-15 00:00:00'
    # utc_hours = date2num(dates, unit_utchours)

# check:
print(dates[0].strftime('%Y%m%d%H'))
# e.g. prints 2019081516

... чтобы получить даты в виде числа, вы можете, например, сделать

num_dates = [int(d.strftime('%Y%m%d%H')) for d in dates]
# replace int with float if you need floating point numbers etc.

.. . чтобы узнать даты в UTC, см. раздел с комментариями в первом блоке кода. Поскольку массив дат содержит объекты типа datetime.datetime , вы также можете сделать

utc_hours = [d.hour+(d.minute/60)+(d.second/3600) for d in dates]
...