In [1]:
%store -r
In [2]:
# Import libraries
import json
import os
import pathlib
import shutil
from glob import glob
import earthpy.api.appeears as eaapp
import earthpy
import geopandas as gpd
import hvplot.pandas
import hvplot.xarray
import pandas as pd
import rioxarray as rxr
import xarray as xr
In [3]:
# Get a sorted list of NDVI tif file paths
ndvi_paths = sorted(list(project.project_dir.rglob(
'MOD13Q1.061__250m_16_days_NDVI*.tif')))
# Display the first and last three files paths to check the pattern
ndvi_paths[:3], ndvi_paths[-3:]
Out[3]:
([PosixPath('/workspaces/data/gc-tubarjal/tubarjal-ndvi/MOD13Q1.061_2001137_to_2022244/MOD13Q1.061__250m_16_days_NDVI_doy2001145000000_aid0001.tif'), PosixPath('/workspaces/data/gc-tubarjal/tubarjal-ndvi/MOD13Q1.061_2001137_to_2022244/MOD13Q1.061__250m_16_days_NDVI_doy2001161000000_aid0001.tif'), PosixPath('/workspaces/data/gc-tubarjal/tubarjal-ndvi/MOD13Q1.061_2001137_to_2022244/MOD13Q1.061__250m_16_days_NDVI_doy2001177000000_aid0001.tif')], [PosixPath('/workspaces/data/gc-tubarjal/tubarjal-ndvi/MOD13Q1.061_2001137_to_2022244/MOD13Q1.061__250m_16_days_NDVI_doy2022209000000_aid0001.tif'), PosixPath('/workspaces/data/gc-tubarjal/tubarjal-ndvi/MOD13Q1.061_2001137_to_2022244/MOD13Q1.061__250m_16_days_NDVI_doy2022225000000_aid0001.tif'), PosixPath('/workspaces/data/gc-tubarjal/tubarjal-ndvi/MOD13Q1.061_2001137_to_2022244/MOD13Q1.061__250m_16_days_NDVI_doy2022241000000_aid0001.tif')])
In [ ]:
doy_start = -25
doy_end = -18
# Loop through each NDVI image
ndvi_das = []
for ndvi_path in ndvi_paths:
# Get date from file name
# print(ndvi_path)
date = pd.to_datetime(ndvi_path.name[doy_start:doy_end], format='%Y%j')
# print(date)
# Open dataset
da = rxr.open_rasterio(ndvi_path,mask_and_scale=True).squeeze()
# display(da)
# da.plot()
# Add date dimension and clean up metadata
da = da.assign_coords({'date': date})
da = da.expand_dims({'date': 1})
da.name = 'NDVI'
# display(da)
# da.plot()
# Prepare for concatenation
ndvi_das.append(da)
len(ndvi_das )
Combine Rasters¶
Next, stack your arrays by date into a time series using the
xr.combine_by_coords()
function. You will have to tell it which
dimension you want to stack your data in.
In [ ]:
# Combine NDVI images from all dates
annual_ndvi_da = (
xr.combine_by_coords(ndvi_das)
.resample(dict(date = 'YS'))
.mean()
)
annual_ndvi_da
Out[ ]:
<xarray.Dataset> Size: 1MB Dimensions: (date: 22, y: 85, x: 165) Coordinates: band int64 8B 1 * x (x) float64 1kB 37.87 37.88 37.88 37.88 ... 38.21 38.21 38.22 * y (y) float64 680B 30.33 30.33 30.33 30.33 ... 30.16 30.16 30.16 spatial_ref int64 8B 0 * date (date) datetime64[ns] 176B 2001-01-01 2002-01-01 ... 2022-01-01 Data variables: NDVI (date, y, x) float32 1MB 0.1336 0.1343 0.1339 ... 0.2285 0.1965
In [ ]:
%store annual_ndvi_da
Stored 'annual_ndvi_da' (Dataset)
Finally, be sure to Restart
and Run all
to make sure your notebook
works all the way through!
In [ ]:
%%capture
%%bash
#Coverting to HTML
jupyter nbconvert vegetation-02-wrangle.ipynb --to html