盤點兩種使用Python讀取.nc文件的方法
大家好,我是Python進階者。
前言
前幾天有個叫【溫池】的粉絲在Python鉆石交流群里問了一道關(guān)于.nc文件讀取的問題,如下圖所示。
.nc文件和常規(guī)的文件不太一樣,有專門的第三方處理庫,netCDF4,需要安裝才行。
- pip install netCDF4
如果覺得下載的慢,可以使用換源的方法進行下載:
- pip install -i https://pypi.tuna.tsinghua.edu.cn/simple netCDF4
關(guān)于永久換源可以參考這個文章:手把手教你進行pip換源,讓你的Python庫下載嗖嗖的(系列二)、手把手教你進行pip換源,讓你的Python庫下載嗖嗖的。
一、nc文件基礎(chǔ)知識
nc 全稱 netCDF(The Network Common Data Form),可以用來存儲一系列的數(shù)組,就是這么簡單。關(guān)于nc文件的介紹,可以參考:
https://www.unidata.ucar.edu/software/netcdf/docs/netcdf_introduction.html
既然 nc 可以用來一系列的數(shù)組,所以經(jīng)常被用來存儲科學觀測數(shù)據(jù),最好還是長時間序列的。
試想一下一個科學家每隔一分鐘采集一次實驗數(shù)據(jù)并存儲了下來,如果不用這種格式存儲,時間長了可能就需要創(chuàng)建一系列的 csv 或者 txt 等,而采用 nc 一個文件就可以搞定,是不是很方便呢?
更方便的是如果這個科學實驗與氣象、水文、溫度等地理信息稍微沾點邊的,完全也可以用 nc 進行存儲, GeoTiff 頂多能多存幾個波段(此處波段可以認為是氣象、水文等不同信號),而 nc 可以存儲不同波段的長時間觀測結(jié)果,是不是非常方便呢?
二、解決方案
方法一:常規(guī)讀取 這個方法是在網(wǎng)上找到的,代碼如下,其中關(guān)鍵部分有注釋,應(yīng)該都可以看得懂。
- # -*- coding: utf-8 -*-
- import netCDF4
- from netCDF4 import Dataset
- nc_obj = Dataset('D:\\tem_e0025_2.nc')
- # 查看nc文件有些啥東東
- # print(nc_obj)
- # print('---------------------------------------')
- # 查看nc文件中的變量,結(jié)果是:['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('---------------------------------------')
- # 讀取數(shù)據(jù)值
- 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文件路徑即可,其他的內(nèi)容,你可以自行自取。
方法二:直接取值 這個方法是【溫池】自己提供的,也是可以讀取文件,進行取值的。
- # -*- coding: utf-8 -*-
- import netCDF4
- from netCDF4 import Dataset
- # 查看nc文件中的變量,結(jié)果是:['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\有趣的代碼\數(shù)據(jù)分析\最小二乘法數(shù)據(jù)分析代碼和數(shù)據(jù)\Temperature_20211031.nc')
- lat = A_temp['latitude'][:].data # 497個數(shù)字
- lon = A_temp['longitude'][:].data # 409個數(shù)字
- temp = A_temp['T'][:].data # 409個數(shù)字
- depth = A_temp['depth'][:].data # 51個數(shù)字
- print(len(lat))
- print(len(lon))
本文參考鏈接:1. https://blog.csdn.net/showpingzhang/article/details/833847802. https://www.cnblogs.com/shoufengwei/p/9068379.html
取值之后,接下來做回歸、聚類等,就不展開贅述了。
三、總結(jié)
我是Python進階者。本文基于粉絲提問,針對.nc文件讀取的問題,給出了兩種解決方法,順利幫助粉絲解決了問題。