2

画像スタックにこのソリューションを使用しようとしましたが、データを調べません!!

問題は、正規表現を使用してファイルパスから年と月を抽出するパットにある可能性があると思います。

すべてのデータは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()

誰かがどこに問題があるか知っていますか? ありがとうございました

4

0 に答える 0