前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Python创建NetCDF文件

如何使用Python创建NetCDF文件

作者头像
MeteoAI
发布2019-07-24 16:46:31
14.2K1
发布2019-07-24 16:46:31
举报
文章被收录于专栏:MeteoAIMeteoAI

之前介绍过如何使用Python处理NetCDF格式文件,这次介绍一下如何创建NetCDF文件。

使用netcdf4-python创建netCDF格式文件通常按照如下流程:

1) 打开/创建netCDF文件对象

2) 定义数据维度

3) 基于定义的维度创建变量

4) 存储数据到变量

5) 为变量和数据集添加属性

6) 关闭文件对象

示例代码如下:

代码语言:javascript
复制
from datetime import datetime

import numpy as np
import pandas as pd

import netCDF4 as nc


## create NetCDF file
newfile = nc.Dataset('newfile.nc', 'w', format='NETCDF4')

## define dimesions
long = newfile.createDimension('longitude', size=360)
lati = newfile.createDimension('latitude', size=180)
heights = newfile.createDimension('height', size=15)
times = newfile.createDimension('time', size=None)

## define variables for storing data
lon = newfile.createVariable('lon', 'f4', dimensions='longitude')
lat = newfile.createVariable('lat', 'f4', dimensions='latitude')
height = newfile.createVariable('height', 'f4', dimensions='height')
time = newfile.createVariable('times', 'S19', dimensions='time')
temps = newfile.createVariable('temperature', 'f4', dimensions=('longitude', 'latitude', 'height', 'time'))

## generate random values
temp = np.random.randint(-40, 40, size=(360, 180, 15, 24))

date_range = pd.date_range(datetime(2019, 6, 1, 0), datetime(2019, 6, 1, 23), freq='1h')

## add data to variables
lon[:] = np.arange(-180, 180)
lat[:] = np.arange(-90, 90)
height[:] = [10, 50, 100, 150, 200, 500, 1000, 1500, 2000, 3000, 4000, 5000, 6000, 8000, 10000]
temps[...] = temp
for i in range(24):
    time[i] = date_range[i].strftime('%Y-%m-%d %H:%M:%S')

## add attributes    
#add global attributes
newfile.title = 'Example of create NetCDF file using netcdf4-python'
newfile.start_time = time[i]
newfile.times = time.shape[0]
newfile.history = 'Created ' + datetime(2019, 6, 1, 0, 0, 0).strftime('%Y-%m-%d %H:%M%S')

#add local attributes to variable
lon.description = 'longitude, west is negative'
lon.units = 'degrees east'

lat.description = 'latitude, south is negative'
lat.units = 'degrees north'

time.description = 'time, unlimited dimension'
time.units = 'times since {0:s}'.format(time[0])

temps.description = 'temperature, random value generated by numpy'
temps.units = 'degree'

height.description = 'height, above ground level'
height.units = 'meters'    

## close file
newfile.close()

创建文件

创建nc文件和读取操作使用相同的命令 Dateset,只需要更改modew或者aw表示写,a表示添加。然后需要指定文件的格式format,目前netCDF4-python支持以下格式:NETCDF3_CLASSIC, NETCDF3_64BIT_OFFSET, NETCDF3_64BIT_DATA, NETCDF4_CLASSICNETCDF4

NETCDF3_CLASSIC是最初netCDF库所支持的格式,缺陷是文件大小不能超过2G,之后的格式没有此限制。NETCDF4_CLASSICNETCDF4格式支持HDF5,能够读取HDF5的库也可以处理这两种格式。

选择文件格式的时候需要注意上述的一些问题。更多的细节见官方文档。

定义维度

因为存储变量的大小取决于其对应的维度,而且变量存储也以维度为界定,所以要先定义维度。维度定义通过.createDimension方法实现。

定义维度时需要注意:netCDF格式文件中存在一个特殊维度:记录维度(record dimension)/无限维度(unlimited dimension),通常是无限大小的,这与常规的经纬度等维度不同。通常时间维度为记录维度,是可以不断增加的。

上述示例中的时间维即为记录维度。通过.isunlimited方法可判断维度是否为记录维度。

定义变量

使用.createVariable方法可以创建变量,只需要给定变量名称,变量类型,变量维度等信息即可。也可以指定一些额外选项对数据进行压缩(精度要求不高/存储空间有限的情况下)。

目前支持的数据类型包括:f4(32位浮点数)f8(64位浮点数)i4(32位符号整型)i2(16位符号整型)i8(64位符号整型)i1(8位符号整型)u1(8位无符号整型)u2(16位无符号整型)u4(32位无符号整型)u8(64位无符号整型)S1(单字符字符串)。对应的旧文件格式数据类型为:fdhsbBcil

定义变量时可以定义单个变量或者使用组的形式定义变量,单个变量的定义只需要给定变量名即可,如上例所示。如果以组的形式定义变量,可使用类似linux路径的形式指定:/WRF/Variables/temperature/Chem/Variables/PM2.5CMAQ/Variables/PM2.5等形式。

更多细节见官方文档。

添加数据

添加数据没什么可说的,按照定义的变量和维度将对应的数据添加到对应变量即可。注意变量维度和数据类型。

添加属性

添加属性时分为全局属性变量属性。全局属性是对应整个文件的属性,顾名思义,变量属性就是对应每个变量的属性。

在创建nc文件时,属性是可选的。但是为了更为明确的表述文件和变量的信息通常要添加属性,也建议添加属性。

上述所有操作完成后,即可关闭打开的文件对象,完成文件的写入操作。更多函数和方法细节和高级操作见官方文档。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MeteoAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建文件
  • 定义维度
  • 定义变量
  • 添加数据
  • 添加属性
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档