Newer
Older
Jeremy Auclair
committed
# -*- coding: UTF-8 -*-
# Python
"""
29-08-2023
@author: jeremy auclair
Jeremy Auclair
committed
Generate convert pandas dataframes to rasters for the pixel mode.
Jeremy Auclair
committed
"""
Jeremy Auclair
committed
from typing import List # to declare variables
import numpy as np # for math on arrays
import xarray as xr # to manage nc files
Jeremy Auclair
committed
import pandas as pd # to manage dataframes
Jeremy Auclair
committed
def convert_dataframe_to_xarray(dataframe_path: str, save_path: str, variables: List[str], data_types: List[str]) -> None:
Jeremy Auclair
committed
Jeremy Auclair
committed
# Open dataframe
dataframe = pd.read_csv(dataframe_path).sort_values(by = ['date', 'id'])
dataframe['date'] = pd.to_datetime(dataframe['date'])
Jeremy Auclair
committed
Jeremy Auclair
committed
# Create dimensions for xarray dataset
x = [i+1 for i in range(len(set(dataframe['id'])))]
y = [1]
dates = np.unique(dataframe['date'].values)
Jeremy Auclair
committed
Jeremy Auclair
committed
# Get dimension sizes
time_size = len(dates)
x_size = len(x)
y_size = len(y)
Jeremy Auclair
committed
Jeremy Auclair
committed
# Create dimension tuples
dim_size = (time_size, x_size, y_size)
dims = ('time', 'x', 'y')
Jeremy Auclair
committed
Jeremy Auclair
committed
# Reshape variables in correct format and put them in a dictionnary
data_variables = {}
for var in variables:
data_variables[var] = (dims, np.reshape(dataframe[var].values, dim_size))
Jeremy Auclair
committed
Jeremy Auclair
committed
# Create xarray dataset
xarray_dataset = xr.Dataset(data_vars = data_variables, coords = {'time': dates, 'x': x, 'y': y})
Jeremy Auclair
committed
Jeremy Auclair
committed
# Create encoding dictionnary
encoding_dict = {}
for var, dtype in zip(variables, data_types):
# Write encoding dict
encod = {}
encod['dtype'] = dtype
encod['chunksizes'] = (time_size, x_size, y_size)
encoding_dict[var] = encod
Jeremy Auclair
committed
Jeremy Auclair
committed
# Save dataset as netCDF4 file
xarray_dataset.to_netcdf(save_path, encoding = encoding_dict)
Jeremy Auclair
committed
Jeremy Auclair
committed
return None