Как записать информацию о дате и времени в netcdf4? - PullRequest
0 голосов
/ 13 декабря 2018

По сути, я хотел бы открыть файл netcdf, считать метки времени для отдельных пикселей, а затем записать метки времени в новый файл.Вот мой псевдокод:

f10 = Dataset(nc_f10, 'r')
Time_UTC_10 = np.transpose(f10.variables['TIME_UTC'][:]) #shape is [92,104]
radiance_10 = f10.variables['RADIANCE'][:] #shape is [92,104]
f10.close()

#Manipulate Radiance Information

#python separates the characters in the timestamp, so join it back up:
for i in np.arange(92):
    for j in np.arange(104):
        joined_16 = ''.join(Time_UTC_16[:,i,j])
        datetime_16[i,j] = datetime.datetime.strptime(joined_16, '%Y-%m-%dT%H:%M:%S.%fZ')

#Create and fill the netcdf 
nc_out = Dataset(output_directory+nc_out_file, 'w', format='NETCDF4')

y = nc_out.createDimension('y',104)
x = nc_out.createDimension('x',92)

times = nc_out.createVariable('time', np.unicode_, ('x','y'))
O5s = nc_out.createVariable('O5s', np.float32, ('x', 'y'))

times[:] = datetime_16
O5s[:] = radiance_10

nc_out.close()

Но когда я пытаюсь запустить это, я получаю следующую ошибку: TypeError: только кусочки строки, юникода или объектные массивы могут быть назначены VLEN str var slice

Я чувствую, что могу неправильно понять что-то важное здесь.Любые мысли о том, как я могу исправить этот код, чтобы записать метки времени в переменную в netcdf?

1 Ответ

0 голосов
/ 20 декабря 2018

Я действительно не знаю, почему вы хотите сохранить свои переменные времени в виде строки (это то, что говорится в сообщении об ошибке: значения могут быть либо строками, юникодом или объектами), но один пример выглядит так:

#!/usr/bin/env ipython
# ----------------------
import numpy as np
from netCDF4 import Dataset,num2date,date2num
# ----------------------
ny=104;
nx=92
# ----------------------
radiance_10=np.random.random((ny,nx));
datetime_16=np.ones((ny,nx))
# ----------------------
nc_out = Dataset('test.nc', 'w', format='NETCDF4')

y = nc_out.createDimension('y',ny)
x = nc_out.createDimension('x',nx)

times = nc_out.createVariable('time', np.unicode_, ('x','y'))
O5s = nc_out.createVariable('O5s', np.float32, ('x', 'y'))

O5s[:] = radiance_10
for ii in range(ny):
    for jj in range(nx):
        times[jj,ii] = "2011-01-01 00:00:00"

nc_out.close()

В основном значения, которые записываются в переменную времени, теперь являются строками со значением в каждой точке сетки "2011-01-01 00:00:00".

Тем не менее, я бы использовалвременные значения как время, прошедшее с произвольно выбранного момента времени.Это самый распространенный способ сохранить время в файле netCDF.Предположим, что наши данные в каждой точке на момент времени 2014-04-11 23:59.Тогда я мог бы сохранить его в секундах с 2014-04-01.Вот код, который я бы использовал:

import numpy as np
from netCDF4 import Dataset,num2date,date2num
import datetime
# ----------------------
ny=104;
nx=92
# ----------------------
radiance_10=np.random.random((ny,nx));
# ---------------------------------------------------
timevalue = datetime.datetime(2014,4,11,23,59)
time_unit_out= "seconds since 2014-04-01 00:00:00"
# ---------------------------------------------------
nc_out = Dataset('test_b.nc', 'w', format='NETCDF4')
y = nc_out.createDimension('y',ny)
x = nc_out.createDimension('x',nx)
times = nc_out.createVariable('time', np.float64, ('x','y'))
times.setncattr('unit',time_unit_out);

O5s = nc_out.createVariable('O5s', np.float32, ('x', 'y'))

O5s[:] = radiance_10
times[:] = date2num(timevalue,time_unit_out);
nc_out.close()

Если вы проверите значение, которое сейчас находится в переменной времени, это 950340, то есть количество секунд с 2014-04-01 00:00до 2014-04-11 23: 59.

...