FAQ | This is a LIVE service | Changelog

Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
NAMEPreProcessor.py 3.15 KiB
import os
import sys

import cftime
import iris.util
from iris.cube import CubeList, Cube


def save_cube(cube: iris.cube.Cube,
              sanitised_field_name: str,
              year_string: str,
              month_string: str,
              output_path: str):

    os.makedirs(output_path, exist_ok = True)

    file_name = "{}-no_part-{}_{}.nc".format(sanitised_field_name, year_string, month_string)
    nc_file_path = os.path.join(output_path, file_name)

    print("writing {}".format(nc_file_path))
    iris.save(cube, nc_file_path)

    # nc_zip_file_path = "{}.zip".format(nc_file_path)
    # print("zipping to {}".format(nc_zip_file_path))
    # with ZipFile(nc_zip_file_path, 'w', zipfile.ZIP_DEFLATED) as zip:
    #     zip.write(nc_file_path, basename(nc_file_path))
    #
    # print("deleting {}".format(nc_file_path))
    # os.remove(nc_file_path)


def process_met_office_NAME(name_file_wildcard: str, out_path: str):

    cube_list = iris.load_raw(name_file_wildcard)

    # get all the field names from the cubes as a unique set
    field_names: set = set()

    for cube in cube_list:
        field_names.add(cube.name())

    # write a cube for each calendar month for each field type
    for field_name in field_names:

        field_name: str = field_name
        print(field_name)
        cube: Cube = cube_list.extract(iris.Constraint(name = field_name))

        for month in range(1, 13):

            month_constraint = iris.Constraint(time = lambda cell: cell.point.month == month)

            cubes_for_month: CubeList = cube.extract(month_constraint)

            if len(cubes_for_month) != 0:
                cube_for_month: Cube = cubes_for_month.merge_cube()

                # hack, the 'cell_methods' field is NonType and this gets the save method of iris upset,
                # so setting to an empty Tuple
                cube_for_month.cell_methods = ()

                time_coord = cube_for_month.coord('time')
                sample_date = time_coord.units.num2date(time_coord.points[0])
                year_string = cftime.datetime.strftime(sample_date, "%Y")
                month_string = cftime.datetime.strftime(sample_date, "%m")
                # year_string = cftime.real_datetime.strftime(sample_date, "%Y")
                # month_string = cftime.real_datetime.strftime(sample_date, "%m")

                # get rid of funny characters, for filename
                sanitised_field_name = field_name.replace("(", "")
                sanitised_field_name = sanitised_field_name.replace(")", "")
                sanitised_field_name = sanitised_field_name.replace("/", "_")

                save_cube(cube_for_month,
                          sanitised_field_name,
                          year_string,
                          month_string,
                          out_path)


if __name__ == '__main__':

    """
    example usage:
    /media/scratch/lb584_scratch/projects/ews/input/eth/MET_20200707/WR_EnvSuit_Met_Ethiopia_20200707/Met_Data_*.txt
    /media/scratch/lb584_scratch/projects/ews/output/name_processing/another_dir
    """

    _name_file_wildcard = sys.argv[1]
    _out_path = sys.argv[2]

    process_met_office_NAME(_name_file_wildcard, _out_path)