社区编辑申请
注册/登录
盘点两种使用Python读取.nc文件的方法
开发 后端
nc 全称 netCDF(The Network Common Data Form),可以用来存储一系列的数组,就是这么简单。既然 nc 可以用来一系列的数组,所以经常被用来存储科学观测数据,最好还是长时间序列的。

大家好,我是Python进阶者。

前言

前几天有个叫【温池】的粉丝在Python钻石交流群里问了一道关于.nc文件读取的问题,如下图所示。

.nc文件和常规的文件不太一样,有专门的第三方处理库,netCDF4,需要安装才行。

  1. pip install netCDF4 

如果觉得下载的慢,可以使用换源的方法进行下载:

  1. pip install -i  https://pypi.tuna.tsinghua.edu.cn/simple netCDF4 

关于永久换源可以参考这个文章:手把手教你进行pip换源,让你的Python库下载嗖嗖的(系列二)、手把手教你进行pip换源,让你的Python库下载嗖嗖的。

一、nc文件基础知识

nc 全称 netCDF(The Network Common Data Form),可以用来存储一系列的数组,就是这么简单。关于nc文件的介绍,可以参考:

https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_introduction.html

既然 nc 可以用来一系列的数组,所以经常被用来存储科学观测数据,最好还是长时间序列的。

试想一下一个科学家每隔一分钟采集一次实验数据并存储了下来,如果不用这种格式存储,时间长了可能就需要创建一系列的 csv 或者 txt 等,而采用 nc 一个文件就可以搞定,是不是很方便呢?

更方便的是如果这个科学实验与气象、水文、温度等地理信息稍微沾点边的,完全也可以用 nc 进行存储, GeoTiff 顶多能多存几个波段(此处波段可以认为是气象、水文等不同信号),而 nc 可以存储不同波段的长时间观测结果,是不是非常方便呢?

二、解决方案

方法一:常规读取 这个方法是在网上找到的,代码如下,其中关键部分有注释,应该都可以看得懂。

  1. # -*- coding: utf-8 -*- 
  2. import netCDF4 
  3. from netCDF4 import Dataset 
  4. nc_obj = Dataset('D:\\tem_e0025_2.nc'
  5.  
  6. # 查看nc文件有些啥东东 
  7. # print(nc_obj) 
  8. # print('---------------------------------------'
  9.  
  10. # 查看nc文件中的变量,结果是:['lon''lat''lev''time''tem'
  11. # print(nc_obj.variables.keys()) 
  12. for i in nc_obj.variables.keys(): 
  13. #     print(i) 
  14. # print('---------------------------------------'
  15.  
  16. # 查看每个变量的信息 
  17. # print(nc_obj.variables['lat']) 
  18. # print(nc_obj.variables['lon']) 
  19. # print(nc_obj.variables['lev']) 
  20. # print(nc_obj.variables['time']) 
  21. # print(nc_obj.variables['tem']) 
  22. # print('---------------------------------------'
  23.  
  24. # 查看每个变量的属性 
  25. # print(nc_obj.variables['lat'].ncattrs()) 
  26. # print(nc_obj.variables['lon'].ncattrs()) 
  27. # print(nc_obj.variables['lev'].ncattrs()) 
  28. # print(nc_obj.variables['time'].ncattrs()) 
  29. # print(nc_obj.variables['tem'].ncattrs()) 
  30. # print(nc_obj.variables['lat'].units) 
  31. # print(nc_obj.variables['lon'].units) 
  32. # print('---------------------------------------'
  33.  
  34. # 读取数据值 
  35. lat = (nc_obj.variables['lat'][:]) 
  36. lon = (nc_obj.variables['lon'][:]) 
  37. lev = (nc_obj.variables['lev'][:]) 
  38. # print(lev) 
  39. time = (nc_obj.variables['time'][:]) 
  40. tem = (nc_obj.variables['tem'][:]) 
  41.  
  42. # lat = (nc_obj.variables['lat'][1:2]) 
  43. # lon = (nc_obj.variables['lon'][1:2]) 
  44. # lev = (nc_obj.variables['lev'][1:2]) 
  45. # time1 = (nc_obj.variables['time'][1:2]) 
  46. # tem = (nc_obj.variables['tem'][1:2]) 
  47.  
  48. # print(lat) 
  49. # print(len(lat)) 
  50. # print(lon) 
  51. # print(lev) 
  52. # print(time1) 
  53. # print(len(time)) 
  54. # print(tem) 
  55. # print('---------------******-------------------'
  56.  
  57. file = open('ppm_lat.txt''a'
  58. file.write('lat,lon,time,tem'+'\n'
  59. file.write('lat,lon'+'\n'
  60. file.write('lat'+'\n'
  61. for i in range(len(lat)): 
  62.     file.write(str(lat[i])+',\n'
  63.     file.write(str(lon[i])+','
  64.     file.write(str(lev[i])+','
  65.     file.write(str(time[i])+','
  66.     file.write(str(tem[i])+',\n'
  67. file.close() 

你只需要替换代码中的nc文件路径即可,其他的内容,你可以自行自取。

方法二:直接取值 这个方法是【温池】自己提供的,也是可以读取文件,进行取值的。

  1. # -*- coding: utf-8 -*- 
  2. import netCDF4 
  3. from netCDF4 import Dataset 
  4.  
  5.  
  6. # 查看nc文件中的变量,结果是:['lon''lat''lev''time''tem'
  7. # print(nc_obj.variables.keys()) 
  8. for i in nc_obj.variables.keys(): 
  9. #     print(i) 
  10. # print('---------------------------------------'
  11.  
  12. A_temp = Dataset(r'E:\PythonCrawler\有趣的代码\数据分析\最小二乘法数据分析代码和数据\Temperature_20211031.nc'
  13. lat = A_temp['latitude'][:].data  # 497个数字 
  14. lon = A_temp['longitude'][:].data  # 409个数字 
  15. temp = A_temp['T'][:].data  # 409个数字 
  16. depth = A_temp['depth'][:].data  # 51个数字 
  17.  
  18. print(len(lat)) 
  19. print(len(lon)) 

 

本文参考链接:1. https://blog.csdn.net/showpingzhang/article/details/833847802. https://www.cnblogs.com/shoufengwei/p/9068379.html

取值之后,接下来做回归、聚类等,就不展开赘述了。

三、总结

我是Python进阶者。本文基于粉丝提问,针对.nc文件读取的问题,给出了两种解决方法,顺利帮助粉丝解决了问题。

 

责任编辑:姜华 来源: Python爬虫与数据挖掘
相关推荐

2022-04-11 11:38:44

Python代码游戏

2022-05-18 23:42:08

网络安全安全分析工具

2022-05-03 22:25:57

Python浏览器语言

2022-05-17 09:14:50

聚类算法python

2022-05-20 08:55:02

py文件exepython

2022-04-19 08:29:12

Python机器学习

2022-04-15 11:30:59

代码,Python保存视频

2022-05-03 23:44:21

Python动态链接库Ctypes

2022-05-10 07:24:19

2022-04-28 07:26:17

PythonDocker容器

2022-05-17 16:56:33

开发工具前端

2022-05-02 16:27:01

JavaScriptHTMLPython

2022-03-18 21:27:36

Python无代码

2022-05-10 16:04:40

编程语言PythonC语言

2022-05-17 15:51:32

数据中心运维能力基础设施

2022-05-16 09:34:17

Python可视化图表

2022-05-16 10:49:28

网络协议数据

2022-05-07 07:26:05

PyScriptHTMLPython 代码

2022-03-17 08:30:28

Python私有属性私有方法

2022-05-11 12:12:32

ScapyPython网络包

同话题下的热门内容

Python 字符串总结,建议收藏!这份Java日志格式规范,拿走不谢!Mybatis-Plus官方发布分库分表神器,一个依赖轻松搞定!后端思维篇:如何应用设计模式优化代码改变 Python 对象规则的黑魔法 Metaclass几种限流算法的Go语言实现JMeter关联之正则表达式提取器在 Go 中实现一个支持并发的 TCP 服务端

编辑推荐

使用Kotlin做开发一个月后的感想面试官问你什么是消息队列?把这篇甩给他!五大自动化测试的Python框架图文详解两种算法:深度优先遍历(DFS)和广度优先遍历(BFS)2018年最流行的十大编程语言,其中包括你用的语言吗?
我收藏的内容
点赞
收藏

51CTO技术栈公众号