如何将两个nc文件按时间维度整合成一个

img


分別有1979年1月分毎天00:00-11:00、12:00-23:00间隔一小时的两个地面风速nc文件,想把它们写到一个nc文件里变成1979年一月份毎天0:00-23:00的地面风速nc文件,要如何操作

这里是一个Python的代码实例,可以实现将两个nc文件按照时间维度整合成一个:

import netCDF4 as nc

# 读取原始nc文件
filename1 = 'file1.nc'
filename2 = 'file2.nc'
nc1 = nc.Dataset(filename1)
nc2 = nc.Dataset(filename2)

# 创建新的nc文件
newnc = nc.Dataset('newfile.nc', 'w')

# 复制第一个文件的变量和维度信息
for name, variable in nc1.variables.items():
    if name not in ['time']:
        newvar = newnc.createVariable(name, variable.datatype, variable.dimensions)
        newvar[:] = variable[:]
    else:
        # 创建新的时间维度
        newdim = newnc.createDimension('time', None)
        newvar = newnc.createVariable(name, variable.datatype, ('time',))
        newvar.units = variable.units
        newvar.calendar = variable.calendar
        newvar.axis = variable.axis

# 将第一个文件的时间数据写入新文件
newnc.variables['time'][:] = nc1.variables['time'][:]

# 将第二个文件的变量数据写入新文件
start_time = nc.num2date(nc2.variables['time'][0], nc2.variables['time'].units, nc2.variables['time'].calendar)
time_index = (nc1.variables['time'][:] < start_time).sum()
for name, variable in nc2.variables.items():
    if name not in ['time']:
        newnc.variables[name][time_index:] = variable[:]
    else:
        # 将第二个文件的时间数据写入新文件
        newnc.variables['time'][time_index:] = variable[:]

# 关闭文件
nc1.close()
nc2.close()
newnc.close()

假设第一个nc文件中的风速变量名是u1和v1,第二个nc文件中的风速变量名是u2和v2,则上面的代码将会把它们整合成一个文件,并命名为newfile.nc。你可以替换变量和文件名,用来适应你的具体场景。

  • 这篇文章讲的很详细,请看:NC环境一直搭不起来网报报错
  • 除此之外, 这篇博客: NC文件数据提取完成(1.16)中的 重新开展我的提取工作,其实就是11月份我做的那份代码,了解清楚文件就可以顺利进行啦。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述

    from netCDF4 import Dataset
    import csv
    import string
    import netCDF4 as nf
    import datetime
    
    nc = Dataset(r'data/ocean_wave_mask_0.25_1979_2019.nc')
    print(nc.variables.keys())
    
    
    time = nc.variables['time'][:]
    # 纬度 latitude
    # expver = nc.variables['expver'][:]  79-21nc是三维,没有这个维度
    # 经度 longitude
    latitude = nc.variables['latitude'][:]
    # 风速
    longitude = nc.variables['longitude'][:]
    lsm = nc.variables['lsm'][:]
    mwd = nc.variables['mwd'][:]
    mwp = nc.variables['mwp'][:]
    swh = nc.variables['swh'][:]
    shts = nc.variables['shts'][:]
    shww = nc.variables['shww'][:]
    
    #解析出时间
    def getDate(time):
        arr = nf.num2date(nc.variables['time'][:], 'hours since 1900-01-01 00:00:00.0').data
        y = arr[0].year
        m = arr[0].month
        return "%(year)d-%(month)02d"%{'year':y,'month':m}
    
    print(getDate(time))
    
    now_time1 = datetime.datetime.now()
    print(now_time1)
    with open(fr'{79-19}.csv', 'a', newline='') as fp:
        #字段名
        writer = csv.writer(fp, delimiter=',', quotechar='"', quoting=csv.QUOTE_MINIMAL)
        # writer.writerow(['time',
        #                   'Land-sea mask',
        #                   'Mean wave direction',
        #                   'Mean wave period',
        #                  'Significant height of combined wind waves and swell',
        #                  'Significant height of total swell',
        #                  'Significant height of wind waves'])
    
        writer.writerow(['time',
                          'lsm',
                          'mwd',
                          'mwp',
                         'swh',
                         'shts',
                         'shww'])
        # 输入经纬度的维数
        # for i in range(len(time)):
        #     for j in range(len(expver)):
        #         for k in range(len(latitude)):
        #             for r in range(len(longitude)):
        #                 if str(lsm[i][j][k][r]) not in '--':
        #                     if str(mwd[i][j][k][r]) not in '--':
        #                         if str(mwp[i][j][k][r]) not in '--':
        #                             if str(swh[i][j][k][r]) not in '--':
        #                                 if str(shts[i][j][k][r]) not in '--':
        #                                     if str(shww[i][j][k][r]) not in '--':
        #                                         writer.writerow([getDate(time[i]),
        #                                                          # expver[j],
        #                                                          # latitude[k],
        #                                                          # longitude[r],
        #                                                          lsm[i, j, k, r],
        #                                                          mwd[i, j, k, r],
        #                                                          mwp[i, j, k, r],
        #                                                          swh[i, j, k, r],
        #                                                          shts[i, j, k, r],
        #                                                          shww[i, j, k, r]
        #                                                          ])
        for i in range(len(time)):
            for k in range(len(latitude)):
                for r in range(len(longitude)):
                    if str(lsm[i][k][r]) not in '--':
                        if str(mwd[i][k][r]) not in '--':
                            if str(mwp[i][k][r]) not in '--':
                                if str(swh[i][k][r]) not in '--':
                                    if str(shts[i][k][r]) not in '--':
                                        if str(shww[i][k][r]) not in '--':
                                            writer.writerow([getDate(time[i]),
                                                                 # expver[j],
                                                                 # latitude[k],
                                                                 # longitude[r],
                                                                 lsm[i, k, r],
                                                                 mwd[i, k, r],
                                                                 mwp[i, k, r],
                                                                 swh[i, k, r],
                                                                 shts[i, k, r],
                                                                 shww[i, k, r]
                                                            ])
    now_time2 = datetime.datetime.now()
    print(now_time2)
    print('yes')