爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 26281|回复: 10

[源代码] python 创建 读写 nc文件 demo

[复制链接]

新浪微博达人勋

发表于 2018-8-30 19:12:12 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 haysen 于 2018-8-30 19:13 编辑

    做了两个demo,一个是用netcdf4模块,创建、读 nc文件,并保存为panel,一个是用xarray模块读和创建,基本都是各个模块说明书里的例子,自己做了demo自己备用,也分享给大家
https://github.com/haysengithub/python_creat_or_read_netcdf_demo.git

  1. import time
  2. import numpy as np
  3. import pandas as pd
  4. from netCDF4 import Dataset

  5. class pyton_netcdf(object):
  6.     def __init__(self):
  7.         pass


  8.     def creat_netcdf_by_netcdf4(self,file_name_nc):
  9.         ntimes = 5
  10.         nlevels = 10
  11.         nlats = 73
  12.         nlons = 144


  13.         rootgrp = Dataset(file_name_nc, "w", format="NETCDF4")
  14.         print(rootgrp.data_model)

  15.         rootgrp.description = "bogus example script"
  16.         rootgrp.history     = "Created"+time.ctime(time.time())
  17.         rootgrp.source      = "netDF4 pytohn module tutorial"

  18.         time_dim  = rootgrp.createDimension(dimname="time",  size=None)
  19.         level_dim = rootgrp.createDimension(dimname="level", size=None)
  20.         lat_dim   = rootgrp.createDimension(dimname="lat",   size=nlats)
  21.         lon_dim   = rootgrp.createDimension(dimname="lon",   size=nlons)


  22.         times = rootgrp.createVariable(varname="time", datatype="f8", dimensions=("time",))
  23.         times.units = "hours since 0001-01-01 00:00:00.0"
  24.         times.calendar = "gregorian"

  25.         levels = rootgrp.createVariable(varname="level", datatype="i4", dimensions=("level",))
  26.         levels.units = "hPa"

  27.         lats = rootgrp.createVariable(varname="lat", datatype="f8", dimensions=("lat",))
  28.         lats.units = "degrees north"

  29.         lons = rootgrp.createVariable(varname="lon", datatype="f8", dimensions=("lon",))
  30.         lons.units = "degrees east"

  31.         temp = rootgrp.createVariable(varname="temp", datatype="f8", dimensions=("time", "level", "lat", "lon",))
  32.         #压缩
  33.         #temp = rootgrp.createVariable(varname="temp", datatype="f8", ("temp",),zlib=True, least_significant_digit=3)
  34.         temp.units ="mm"



  35.         from datetime import datetime, timedelta
  36.         from netCDF4 import date2num
  37.         times_data = [datetime(2001,3,1)+n*timedelta(hours=12) for n in range(ntimes)]
  38.         times[:]   = date2num(times_data, units=times.units, calendar = times.calendar)

  39.         levels[:]  = np.arange(start=0, stop = nlevels, step=1)

  40.         lats[:]    = np.arange(start=-90, stop=91, step=2.5)
  41.         lons[:]    = np.arange(start=-180,stop=180,step=2.5)

  42.         from numpy .random import uniform
  43.         temp[:] = uniform(size=(ntimes,nlevels,nlats,nlons))

  44.         rootgrp.close()
  45.         print(file_name_nc)

  46.     def read_netcdf_by_netcdf4(self,file_name_nc):
  47.         rootgrp = Dataset(file_name_nc)

  48.         #print(rootgrp.dimensions)
  49.         print("dimensions")
  50.         for dimobj in rootgrp.dimensions.values():
  51.             #print(dimobj)
  52.             if dimobj.isunlimited():
  53.                 print("\t\t", getattr(dimobj, "name"), "=UNLIMITED; //(", getattr(dimobj, "size"), "currently)")
  54.                 #也可以
  55.                 #print("\t\t", dimobj.name, "=UNLIMITED; //(", dimobj.size, "currently)")
  56.             else:
  57.                 print("\t\t", dimobj.name, "=", dimobj.size)

  58.         #print(rootgrp.variables)
  59.         print("variables:")
  60.         for varobj in rootgrp.variables.values():
  61.             print("\t\t", varobj.dtype, varobj.name, varobj.dimensions, ":")
  62.             for var_cattrs_name in varobj.ncattrs():
  63.                 print("\t\t"*2, varobj.name, ":", var_cattrs_name, "=", getattr(varobj,var_cattrs_name))

  64.         print("//global attributes:")
  65.         for global_attr in rootgrp.ncattrs():
  66.             print("\t\t", global_attr, "=", getattr(rootgrp,global_attr))
  67.         print("^"*20)

  68.         # 直接读的例子
  69.         print(rootgrp.description)
  70.         print(rootgrp.dimensions["level"].name)
  71.         print(rootgrp.dimensions["level"])
  72.         print(rootgrp.variables["time"].units)
  73.         print(rootgrp.variables["level"][:])
  74.         print(rootgrp.variables["level"].shape)
  75.         temp_nc_maskarray = rootgrp.variables["temp"][:]
  76.         print(temp_nc_maskarray)
  77.         print(temp_nc_maskarray.data)
  78.         print(temp_nc_maskarray.mask)
  79.         print(temp_nc_maskarray.fill_value)


  80.     def netcdf_to_panel_by_netcdf4(self,file_name_nc):
  81.         rootgrp = Dataset(file_name_nc)


  82.         temp_panel = pd.Panel(data=rootgrp.variables["temp"][:, 0, :, :].data,
  83.                               items= rootgrp.variables["time"][:].data,
  84.                               major_axis=rootgrp.variables["lat"][:].data,
  85.                               minor_axis=rootgrp.variables["lon"][:].data)
  86.         print(temp_panel)

  87.         from netCDF4 import num2date

  88.         times = rootgrp.variables["time"]

  89.         times_data = num2date(times[:], units=times.units, calendar=times.calendar)
  90.         print(times_data)
  91.         '''
  92.         temp_panel4d = pd.Panel4D(data=rootgrp.variables["temp"][:, :, :].data,
  93.                                 labels=pd.period_range(start=times_data[0].strftime("%Y%m%d%H%M"), end=None, periods=times.shape[0],freq="12h",name="time"),
  94.                                 items=rootgrp.variables["level"][:].data,
  95.                                 major_axis=rootgrp.variables["lat"][:].data,
  96.                                 minor_axis=rootgrp.variables["lon"][:].data)
  97.         print(temp_panel4d)
  98.         '''

  99.     def creat_netcdf_by_xarray(self, file_name_nc):
  100.         #Creat an example dateset
  101.         import numpy as np
  102.         import pandas as pd
  103.         import xarray as xr

  104.         ntimes = 5
  105.         nlevels = 10
  106.         nlats = 73
  107.         nlons = 144

  108.         levels  = np.arange(start=0, stop = nlevels, step=1)

  109.         lats    = np.arange(start=-90, stop=91, step=2.5)
  110.         lons    = np.arange(start=-180,stop=180,step=2.5)

  111.         from numpy .random import uniform
  112.         temps = uniform(size=(ntimes,nlevels,nlats,nlons))

  113.         times = pd.date_range("2001-03-01 00:00", periods = temps.shape[0],freq="12h")

  114.         dims = ["time", "level", "lat", "lon"]

  115.         temp_attr = dict(standard_name="air_potential_tempeature", uints="f")
  116.         prcp_attr = dict(standard_name="convective_precipitation_flux", uints="mm")

  117.         level_attr = dict(standard_name="level", uints="hPa")
  118.         lat_attr   = dict(standard_name="lat", uints="degrees north")
  119.         lon_attr   = dict(standard_name="lon", uints="degrees east")

  120.         ds = xr.Dataset({
  121.             "temperature":(dims,temps,temp_attr),
  122.             "precipitation":(dims,temps,prcp_attr)},
  123.             coords={
  124.                 "time":times,
  125.                 "level":(["level"],levels,level_attr),
  126.                 "lat":(["lat"],lats,lat_attr),
  127.                 "lon":(["lon"],lons,lon_attr)
  128.                 #"reference_time":pd.Timestamp("2001-03-01 00:00")
  129.                  }
  130.             )

  131.         ds.attrs=dict(description="bogus example script",
  132.                     history="Created"+time.ctime(time.time()),
  133.                     source="xarray python module tuorial",
  134.                     author="some one")

  135.         ds.to_netcdf(path=file_name_nc, mode="w", format="NETCDF4")

  136.     def read_netcdf_to_xarray(self, file_name_nc):
  137.         import xarray
  138.         ds = xarray.open_dataset(file_name_nc)

  139.         print("-"*20)

  140.         #查看attrs,orderedDict,可以按照字典进行遍历
  141.         print(ds.attrs)
  142.         print("-"*20)

  143.         #查看dims,SortedKeysDict,可以按照字典进行遍历
  144.         print(ds.dims)
  145.         print("-"*20)

  146.         #查看coordinates 可以按照字典遍历,所谓coordinates,这里专指time level lat lon 这样的维度的数据
  147.         print(ds.coords)
  148.         print("-"*20)

  149.         #coords_value 是一个DataArray
  150.         for coords_value in ds.coords.values():
  151.             print(coords_value)
  152.             print("-"*5)
  153.             print(coords_value.dims)
  154.             print("-"*5)
  155.             print(coords_value.values)
  156.             print("-"*5)
  157.             print(coords_value.coords)
  158.             print("-"*5)
  159.             print(coords_value.name)
  160.             print("-"*5)
  161.             print(coords_value.attrs)
  162.             print("-"*5)
  163.             print(coords_value.data)
  164.         print("-"*20)

  165.         #举个例子
  166.         print(ds.coords["lon"].attrs)
  167.         print(ds.coords["level"].values)

  168.         print("-"*20)

  169.         #查看数据,这个是除了维度信息后真正的数据,比如本例子中的温度和降雨量,也是个字典
  170.         for data_value in ds.data_vars.values():
  171.             print(data_value)
  172.             print("-"*5)
  173.             print(data_value.dims)
  174.             print("-"*5)
  175.             print(data_value.values)
  176.             print("-"*5)
  177.             print(data_value.coords)
  178.             print("-"*5)
  179.             print(data_value.name)
  180.             print("-"*5)
  181.             print(data_value.attrs)
  182.             print("-"*5)
  183.             print(data_value.data)

  184.             #再举个例子
  185.             print(ds.data_vars["precipitation"].values)  #同data
  186.             print(ds.data_vars["precipitation"].attrs)   #参数
  187.             print(ds.data_vars["precipitation"].name)    #名字
  188.             print(ds.data_vars["precipitation"].data)    #真正的数据

  189.             print(ds.data_vars["temperature"].values)
  190.             print(ds.data_vars["temperature"].attrs)
  191.             print(ds.data_vars["temperature"].name)
  192.             print(ds.data_vars["temperature"].data)


  193.         #这条命令类似于于ncdump -h
  194.         print(ds.info())











  195. if __name__ == "__main__":

  196.     py_nc = pyton_netcdf()
  197.     py_nc.creat_netcdf_by_netcdf4("netcdf4.nc")
  198.     py_nc.read_netcdf_by_netcdf4("netcdf4.nc")
  199.     py_nc.netcdf_to_panel_by_netcdf4("netcdf4.nc")

  200.     py_nc.creat_netcdf_by_xarray("xarray.nc")
  201.     py_nc.read_netcdf_to_xarray("xarray.nc")
复制代码


密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-8-30 22:08:43 | 显示全部楼层
写的太复杂了,用函数会更好点
密码修改失败请联系微信:mofangbao
回复 支持 1 反对 0

使用道具 举报

新浪微博达人勋

发表于 2018-8-31 09:48:29 | 显示全部楼层
猫神可以给点例子+建议
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-8-31 11:34:33 | 显示全部楼层
又是那隻貓 发表于 2018-8-30 22:08
写的太复杂了,用函数会更好点

嗯,这个主要是给自己看的,写这样是很多用法是从help文件里拔出来的,怕自己忘了,干脆都写上,对我自己是一目了然,对别人可能会感觉冗余,稍后有空再出个精简版的,后面还会补充时间序列处理,比如小时转日数量,日转月啥的,不过我看NCL这些函数都有了,打算还是直接用ncl了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-9-3 10:34:00 | 显示全部楼层
牛逼,问一下,哪里下载necp资料
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-9-7 07:23:18 | 显示全部楼层
python 可以用pynio
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-9-15 20:32:26 | 显示全部楼层
有点复杂,没看懂
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2018-9-27 08:56:17 | 显示全部楼层
良心帖子,非常好!!!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2018-10-9 22:28:17 | 显示全部楼层
有位 冬青老先生 问我问题,我发现我没有发消息的权限(这个设定是脑子抽了么,别人可以给我发消息,我没有权限回人家)
就在这里回复了
你好,没有前后语境我也看不出来哦,目前看到的units 应该不对,这个要符合nc文件时间格式,比如我的例子里 "hours since 0001-01-01 00:00:00.0"   ,或者"days since 2017-01-01" 这样, 你只有一个hours是不对的吧。你的time数组我看不到。如果你用netcdf4这个包的话,你可以help(num2date) 查看它的用法
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2020-2-24 18:41:47 | 显示全部楼层
解决了我不会读nc文件全局属性的问题!{:eb502:}
密码修改失败请联系微信:mofangbao
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表