目的:需要读取多年MODIS数据,需将2000-2020年每个月一个nc数据合并成一个nc文件
MODIS的数据格式:
MOD08_M3.A2000153.061.2017276072839
其中2000代表year, 153代表day of year
#day of year 转 month,day
def doy2date(year,doy):
month_leapyear = [31,29,31,30,31,30,31,31,30,31,30,31]
month_notleap = [31,28,31,30,31,30,31,31,30,31,30,31]
if year%4==0 and (year%100!=0 or year%400==0):
for i in range(0,12):
if doy>month_leapyear[i]:
doy-=month_leapyear[i]
continue
if doy<=month_leapyear[i]:
month = i+1
day = doy
break
else:
for i in range(0,12):
if doy>month_notleap[i]:
doy-=month_notleap[i]
continue
if doy<=month_notleap[i]:
month = i+1
day = doy
break
return month,day
```python
#创建nc文件
out_dir = 'H:/machinelearning/'
out_file_nc = out_dir + 'out.nc'
# data_nc = np.zeros(shape=(61, 1000, 2000))
filename = out_file_nc
# value = data_nc
gridspi = Dataset(filename, 'w', format='NETCDF4')
# dimensions
gridspi.createDimension('time', None)
gridspi.createDimension('lat', 180) # len(lat)
gridspi.createDimension('lon', 360)
# Create coordinate variables for dimensions
times = gridspi.createVariable('time', 'S19', ('time',))
# times = gridspi.createVariable('time', np.float64, ('time',))
latitudes = gridspi.createVariable('lat', np.float32, ('lat',))
longitudes = gridspi.createVariable('lon', np.float32, ('lon',))
clf = gridspi.createVariable('clf', np.float32, ('time', 'lat', 'lon',))
# 写入数据
dates = []
clfs = []
for file in os.listdir(modisDir):
data = xr.open_dataset(modisDir+file,engine='netcdf4')['Cloud_Retrieval_Fraction_1L_Liquid_FMean']
year = int(file[10:14])
doy = int(file[14:17])
[month,day] = doy2date(year, doy)
dates.append(str(year)+'-'+str(month)+'-'+str(day))
date = datetime(year,month, day)
dates.append(date)
clfs.append(data[:])
# 向nc文件中写入数据
latitudes[:] = data['YDim:mod08']
longitudes[:] = data['XDim:mod08']
clf[:] = clfs
#可以以string的形式写入,dtype是object,后续无法对时间维度进行时间上的操作例如groupby等
times[:] = dates_dt.strftime('%Y-%m-%d').to_numpy()
gridspi.close()