盘点两种使用Python读取.nc文件的方法

Python爬虫与数据挖掘

共 4018字,需浏览 9分钟

 ·

2022-01-20 13:50

点击上方“Python爬虫与数据挖掘”,进行关注

回复“书籍”即可获赠Python从入门到进阶共10本电子书

啼时惊妾梦,不得到辽西。

    大家好,我是Python进阶者。


前言

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

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

pip install netCDF4

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

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 可以存储不同波段的长时间观测结果,是不是非常方便呢?


二、解决方案

方法一:常规读取
    这个方法是在网上找到的,代码如下,其中关键部分有注释,应该都可以看得懂。
# -*- coding: utf-8 -*-import netCDF4from netCDF4 import Datasetnc_obj = Dataset('D:\\tem_e0025_2.nc')
# 查看nc文件有些啥东东# print(nc_obj)# print('---------------------------------------')
# 查看nc文件中的变量,结果是:['lon', 'lat', 'lev', 'time', 'tem']# print(nc_obj.variables.keys())# for i in nc_obj.variables.keys():# print(i)# print('---------------------------------------')
# 查看每个变量的信息# print(nc_obj.variables['lat'])# print(nc_obj.variables['lon'])# print(nc_obj.variables['lev'])# print(nc_obj.variables['time'])# print(nc_obj.variables['tem'])# print('---------------------------------------')
# 查看每个变量的属性# print(nc_obj.variables['lat'].ncattrs())# print(nc_obj.variables['lon'].ncattrs())# print(nc_obj.variables['lev'].ncattrs())# print(nc_obj.variables['time'].ncattrs())# print(nc_obj.variables['tem'].ncattrs())## print(nc_obj.variables['lat'].units)# print(nc_obj.variables['lon'].units)# print('---------------------------------------')
# 读取数据值lat = (nc_obj.variables['lat'][:])lon = (nc_obj.variables['lon'][:])lev = (nc_obj.variables['lev'][:])# print(lev)time = (nc_obj.variables['time'][:])tem = (nc_obj.variables['tem'][:])
# lat = (nc_obj.variables['lat'][1:2])# lon = (nc_obj.variables['lon'][1:2])# lev = (nc_obj.variables['lev'][1:2])# time1 = (nc_obj.variables['time'][1:2])# tem = (nc_obj.variables['tem'][1:2])
# print(lat)# print(len(lat))# print(lon)# print(lev)# print(time1)# print(len(time))# print(tem)# print('---------------******-------------------')
file = open('ppm_lat.txt', 'a')file.write('lat,lon,time,tem'+'\n')file.write('lat,lon'+'\n')file.write('lat'+'\n')for i in range(len(lat)): file.write(str(lat[i])+',\n') file.write(str(lon[i])+',') file.write(str(lev[i])+',') file.write(str(time[i])+',') file.write(str(tem[i])+',\n')file.close()

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


方法二:直接取值
    这个方法是【温池】自己提供的,也是可以读取文件,进行取值的。
# -*- coding: utf-8 -*-import netCDF4from netCDF4 import Dataset

# 查看nc文件中的变量,结果是:['lon', 'lat', 'lev', 'time', 'tem']# print(nc_obj.variables.keys())# for i in nc_obj.variables.keys():# print(i)# print('---------------------------------------')
A_temp = Dataset(r'E:\PythonCrawler\有趣的代码\数据分析\最小二乘法数据分析代码和数据\Temperature_20211031.nc')lat = A_temp['latitude'][:].data # 497个数字lon = A_temp['longitude'][:].data # 409个数字temp = A_temp['T'][:].data # 409个数字depth = A_temp['depth'][:].data # 51个数字
print(len(lat))print(len(lon))

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

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


三、总结

    我是Python进阶者。本文基于粉丝提问,针对.nc文件读取的问题,给出了两种解决方法,顺利帮助粉丝解决了问题。虽然文中例举了两种方法,但是小编相信肯定还有其他的方法的,也欢迎大家在评论区谏言。

    最后感谢分享【温池】提问,感谢【🌑(这是月亮的背面)】、【dcpeng】等大佬参与讨论和解决。

    小伙伴们,快快用实践一下吧!如果在学习过程中,有遇到任何问题,欢迎加我好友,我拉你进Python学习交流群共同探讨学习。

------------------- End -------------------

往期精彩文章推荐:

欢迎大家点赞,留言,转发,转载,感谢大家的相伴与支持

想加入Python学习群请在后台回复【入群

万水千山总是情,点个【在看】行不行

/今日留言主题/

随便说一两句吧~~

浏览 37
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报