我尝试将this solution用于我的图像堆栈,但我没有查看数据!!
我认为问题可能来自 pat ,它使用 regex 从文件路径中提取年份和月份。
所有数据都在名为 data_sample 的文件夹中,以下是文件名称:
R20060111_075725___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif
R20060114_080443___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif
R20060117_081036___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif
R20060118_073857___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif
输出是:
dimensions:
lon = 8000 ;
lat = 8000 ;
time = UNLIMITED ; // (0 currently)
variables:
float time(time) ;
time:units = "days since 2006-01-11 00:00:00" ;
time:standard_name = "time" ;
float lon(lon) ;
lon:standard_name = "longitude" ;
float lat(lat) ;
lat:standard_name = "latitude" ;
int crs ;
crs:long_name = "Lon/Lat Coords in WGS84" ;
crs:grid_mapping_name = "latitude_longitude" ;
crs:longitude_of_prime_meridian = 0. ;
crs:semi_major_axis = 6378137. ;
crs:inverse_flattening = 298.257223563 ;
short tmn(time, lat, lon) ;
tmn:_FillValue = -9999s ;
tmn:units = "degC" ;
tmn:scale_factor = 0.01 ;
tmn:add_offset = 0. ;
tmn:long_name = "minimum monthly temperature" ;
tmn:standard_name = "air_temperature" ;
tmn:grid_mapping = "crs" ;
// global attributes:
:Conventions = "CF-1.6" ;
}
这是我编辑的代码(@ rich-signell)
import numpy as np
import datetime as dt
import os
import gdal
import netCDF4
import re
ds = gdal.Open('/data_sample/R20060111_075725___SIG0__ASAWS___M1VVD_TUW_SGRT15A00_AF075M_E060N054T6.tif')
a = ds.ReadAsArray()
nlat, nlon = np.shape(a)
b = ds.GetGeoTransform() # bbox, interval
lon = np.arange(nlon)*b[1]+b[0]
lat = np.arange(nlat)*b[5]+b[3]
basedate = dt.datetime(2006, 01, 11, 0, 0, 0)
# Create NetCDF file
nco = netCDF4.Dataset('time_series.nc', 'w', clobber=True)
chunk_lon = 16
chunk_lat = 16
chunk_time = 12
# Create dimensions, variables and attributes:
nco.createDimension('lon', nlon)
nco.createDimension('lat', nlat)
nco.createDimension('time', None)
timeo = nco.createVariable('time', 'f4', ('time',))
timeo.units = 'days since 2006-01-11 00:00:00'
timeo.standard_name = 'time'
lono = nco.createVariable('lon', 'f4', ('lon',))
lono.standard_name = 'longitude'
lato = nco.createVariable('lat', 'f4', ('lat',))
lato.standard_name = 'latitude'
# Create container variable for CRS: lon/lat WGS84 datum
crso = nco.createVariable('crs', 'i4')
crso.long_name = 'Lon/Lat Coords in WGS84'
crso.grid_mapping_name = 'latitude_longitude'
crso.longitude_of_prime_meridian = 0.0
crso.semi_major_axis = 6378137.0
crso.inverse_flattening = 298.257223563
# Create short integer variable for temperature data, with chunking
tmno = nco.createVariable('tmn', 'i2', ('time', 'lat', 'lon'),
zlib=True, chunksizes=[chunk_time,
chunk_lat,
chunk_lon],
fill_value=-9999)
tmno.units = 'degC'
tmno.scale_factor = 0.01
tmno.add_offset = 0.00
tmno.long_name = 'minimum monthly temperature'
tmno.standard_name = 'air_temperature'
tmno.grid_mapping = 'crs'
tmno.set_auto_maskandscale(False)
nco.Conventions = 'CF-1.6'
# Write lon,lat
lono[:] = lon
lato[:] = lat
pat = re.compile('(\w{1})(\d{4})(\d{2})(\d{2})_\d{6}')
itime = 0
# Step through data, writing time and data to NetCDF
for root, dirs, files in os.walk('/data_sample/'):
dirs.sort()
files.sort()
for f in files:
if re.match(pat, f):
# read the time values by parsing the filename
year = int(f[4:8])
mon = int(f[8:10])
date = dt.datetime(year, mon, 1, 0, 0, 0)
print(date)
dtime = (date-basedate).total_seconds()/86400.
timeo[itime] = dtime
# min temp
tmn_path = os.path.join(root, f)
print(tmn_path)
tmn = gdal.Open(tmn_path)
a = tmn.ReadAsArray() # data
tmno[itime, :, :] = a
itime = itime+1
nco.close()
有人知道哪里可能有问题吗? 谢谢