写在最前面
愿称之为:支持私人订制、非常完美的版本
参考:
解析部分参考:
https://blog.csdn.net/qq_40105563/article/details/119871620
时间换算参考:
https://blog.csdn.net/weixin_51015047/article/details/122571396
{不规则时间}:
https://blog.csdn.net/weixin_43646592/article/details/113427937
写入csv文件参考:
https://blog.csdn.net/Cqh__/article/details/109750908
原文发布时间:2023-09-09 21:06:47
质量分过低,因此进行完善
解析nc文件(代码汇总放最后面)
方便后续代码调整
读取nc文件
不清楚原因,xarray库读取有问题,只能用netCDF4库
获取气象文件中所有变量
解析时间
生成的real_time是一个numpy数组,数组中嵌套的是datetime对象
从1800年开始的,网上部分代码是从1900年开始的
将数据转化为字符串形式
注意:由于这个数据都是每个月1日,所以只用保存年/月
格式的数据即可
如果需要保存年/月/日
格式的数据,代码可改成:
data0 = str(real_time[i].year)+"/"+str(real_time[i].month)+str(real_time[i].day)
年月日时分秒,以此类推
解析部分代码汇总
import netCDF4 from netCDF4 import Dataset dir = r'sst.mnmean.nc' # 替换为自己的nc文件 nc = Dataset(dir) # 获取气象文件中所有变量 vars=nc.variables.keys() #取出各variable的数据看看,数据格式为numpy数组 for var in vars: #读取每个变量的值 var_data=nc.variables[var][:].data print(var,var_data.shape) time = nc.variables['time'] # 读取时间 real_time = netCDF4.num2date(time,time.units) print(real_time) #查看一下time的属性 nc.variables['time'] time = nc.variables['time'] # 读取时间 real_time = netCDF4.num2date(time,time.units) print(real_time) print(real_time[0].year,real_time[0].month) print(str(real_time[0].year)+"/"+str(real_time[0].month)) data = [] for i in range(len(real_time)): data0 = str(real_time[i].year)+"/"+str(real_time[i].month) data.append(data0) print(data)
写入csv文件
from netCDF4 import Dataset import csv nc = Dataset('sst.mnmean.nc') print(nc.variables.keys()) lat = nc.variables['lat'][:] lon = nc.variables['lon'][:] sst = nc.variables['sst'][:] time = nc.variables['time'] # 读取时间 # 将时间转化格式:cftime.DatetimeGregorian(1854, 1, 1, 0, 0, 0, 0, has_year_zero=False) real_time = netCDF4.num2date(time,time.units) print(real_time) # 将时间转化格式:['1854/1', '1854/2', '1854/3', '1854/4', '1854/5', '1854/6', '1854/7'] data = [] for i in range(len(real_time)): data0 = str(real_time[i].year)+"/"+str(real_time[i].month) data.append(data0) print(data) # def getDate(num): # y = 1801 + num/12 # m = 1 + num % 12 # return "%(year)d-%(month)02d"%{'year':y,'month':m} with open('New_nc v2.0版本.csv', 'a', newline='') as fp: writer = csv.writer(fp, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL) writer.writerow(['time', 'lat', 'lon', 'sst']) # 输入经纬度的维数 for i in range(len(data)): for j in range(len(lat)): for k in range(len(lon)): if str(sst[i][j][k]) not in '--': writer.writerow([data[i], lat[j], lon[k], sst[ i, j, k]])
完结✿✿ヽ(°▽°)ノ✿
完善
代码解读
解析部分的代码
这段代码用于解读和处理NetCDF格式的气象文件(.nc文件),并提取其中的时间戳信息。以下是代码的解读:
- 首先,导入了
netCDF4
库,并从中导入Dataset
类,这是用于处理NetCDF文件的关键类。 dir
变量指定了NetCDF文件的路径,即要打开和解析的文件。请根据您的实际文件路径替换它。- 使用
Dataset(dir)
语句打开了指定路径的NetCDF文件,创建了一个名为nc
的Dataset对象,以便后续操作。 - 获取气象文件中的所有变量,这是通过
vars=nc.variables.keys()
语句实现的。这将返回一个包含所有变量名称的列表。 - 然后,通过
for
循环遍历每个变量,读取其值并打印出变量名称以及其数据的形状。这是通过以下代码实现的:
for var in vars: var_data = nc.variables[var][:].data print(var, var_data.shape)
- 接下来,通过
nc.variables['time']
语句,获取了名为time
的时间变量,该变量包含时间戳信息。 - 使用
netCDF4.num2date()
函数,将时间戳数据转换为真实日期和时间。这是通过以下代码实现的:
time = nc.variables['time'] real_time = netCDF4.num2date(time, time.units)
- 打印了第一个时间戳的年份和月份,以及将其格式化为字符串的结果。
- 创建了一个名为
data
的空列表,接着使用for
循环遍历real_time
中的每个日期,并将其格式化为字符串(年/月)后,添加到data
列表中。 - 最后,打印了整个
data
列表,其中包含了所有日期信息,以年/月格式表示。
总之,这段代码用于从NetCDF气象文件中提取时间戳信息,并将时间戳转换为易于理解的日期格式。这对于处理和分析气象数据非常有用。请确保替换dir
变量为您自己的NetCDF文件路径,以便在您的实际数据上运行代码。
写入csv文件的代码
这段代码用于将从NetCDF文件中提取的气象数据写入CSV文件,以下是代码的解读:
- 首先,导入了
netCDF4
库的Dataset
模块以及csv
库,这是用于处理NetCDF文件和CSV文件的关键模块。 - 使用
Dataset
模块打开了名为sst.mnmean.nc
的NetCDF文件,创建了一个名为nc
的Dataset对象,以便后续操作。 - 通过
nc.variables.keys()
语句,获取了NetCDF文件中的所有变量名称,并将其打印出来,这有助于了解文件的内容。 - 通过
nc.variables['lat'][:]
、nc.variables['lon'][:]
、nc.variables['sst'][:]
,分别读取了名为lat
、lon
、sst
的变量,并将其数据存储在lat
、lon
和sst
变量中。 - 使用
nc.variables['time']
语句,获取了名为time
的时间变量,该变量包含时间戳信息。 - 使用
netCDF4.num2date()
函数,将时间戳数据转换为真实日期和时间,并将结果存储在real_time
变量中。这部分代码已经在前面的代码解读中详细解释过。 - 创建一个空列表
data
,接着使用for
循环遍历real_time
中的每个日期,并将其格式化为字符串(年/月)后,添加到data
列表中。这部分代码也在前面的代码解读中解释过。 - 打开名为
New_nc v2.0版本.csv
的CSV文件,如果文件不存在则会创建一个新的,使用csv.writer()
函数创建一个writer
对象,该对象用于写入CSV文件。设置了适当的分隔符、引号字符和引用规则。 - 使用
writer.writerow(['time', 'lat', 'lon', 'sst'])
,写入CSV文件的标题行,包括time
、lat
、lon
和sst
等列名。 - 使用嵌套的
for
循环,遍历日期、纬度(lat)和经度(lon)的所有组合,将对应的时间、纬度、经度和海表温度(sst)写入CSV文件,前提是sst[i][j][k]
不等于’–'。这将产生一个CSV文件,包含了每个时间点、纬度和经度的海表温度数据。
总之,这段代码用于从NetCDF气象文件中提取时间戳和气象数据,然后将数据写入CSV文件,以便进行后续分析和处理。请确保替换文件路径和输出文件名以适应您的实际情况。