首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将datetime信息写入netcdf4?

如何将datetime信息写入netcdf4?
EN

Stack Overflow用户
提问于 2018-12-13 06:12:13
回答 1查看 2.9K关注 0票数 1

实际上,我想打开一个netcdf文件,读出各个像素的时间戳,然后将这些时间戳写入一个新文件。下面是我的伪代码:

代码语言:javascript
复制
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:只能将数字字符串、unicode或对象数组分配给VLEN str var切片

我觉得我可能误解了一些重要的东西。关于如何更正此代码以将时间戳写入netcdf中的变量,您有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2018-12-20 21:50:06

我真的不知道,为什么要将时间变量保存为字符串(这是错误消息所说的:值可以是字符串、unicode或对象),但一个示例如下所示:

代码语言:javascript
复制
#!/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以来的秒数。下面是我要用到的代码:

代码语言:javascript
复制
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()

如果检查time变量中现在的值,它是950340,这是从2014-04-01 00:00到2014-04-11 23:59的秒数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53752170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档