将多个GeoTIFF图像的栅格时间序列转换为NetCDF

时间:2017-10-23 22:15:11

标签: python dask python-xarray rasterio

我有一个存储在多个GeoTIFF文件(*.tif)中的栅格时间序列,我想将其转换为单个NetCDF文件。数据为uint16

我可以使用gdal_translate将每张图片转换为netcdf:

 gdal_translate -of netcdf -co FORMAT=NC4 20150520_0164.tif foo.nc

然后使用NCO编写脚本以从文件名中提取日期然后连接,但我想知道我是否可以使用xarray在Python中更有效地执行此操作并且它是新的rasterio后端。

我可以轻松阅读文件:

import glob
import xarray as xr
f = glob.glob('*.tif')
da = xr.open_rasterio(f[0]) 
da

返回

<xarray.DataArray (band: 1, y: 5490, x: 5490)>
[30140100 values with dtype=uint16]
Coordinates:
  * band     (band) int64 1
  * y        (y) float64 5e+05 5e+05 5e+05 5e+05 5e+05 4.999e+05 4.999e+05 ...
  * x        (x) float64 8e+05 8e+05 8e+05 8e+05 8.001e+05 8.001e+05 ...
Attributes:
    crs:      +init=epsg:32620

我可以将其中一个写入NetCDF:

ds.to_netcdf('foo.nc')

但理想情况下,我可以使用类似xr.open_mfdataset的内容,编写时间值(从文件名中提取),然后将整个聚合写入netCDF。让dask处理核心内存问题。 : - )

可以使用xarraydask完成此类操作吗?

1 个答案:

答案 0 :(得分:5)

Xarray应该可以为您完成连续步骤。我在下面修改了你的例子。您可以将文件名解析为有用的内容。

import glob
import pandas as pd
import xarray as xr

def time_index_from_filenames(filenames):
    '''helper function to create a pandas DatetimeIndex
       Filename example: 20150520_0164.tif'''
    return pd.DatetimeIndex([pd.Timestamp(f[:8]) for f in filenames])

filenames = glob.glob('*.tif')
time = xr.Variable('time', time_index_from_filenames(filenames))
chunks = {'x': 5490, 'y': 5490, 'band': 1}
da = xr.concat([xr.open_rasterio(f, chunks=chunks) for f in filenames], dim=time)