Source code for energy_balance.scripts.create_files

#!/usr/bin/env python

__author__ = 'Elle Smith'
__date__ = '09 Aug 2021'
__contact__ = 'eleanor.smith@stfc.ac.uk'

import argparse
import os
import pandas as pd
from datetime import datetime
from dateutil.relativedelta import relativedelta
from energy_balance.netcdf.soil_netcdf import SoilNetCDF
from energy_balance.netcdf.soil_quality_control import SoilQualityControl
from energy_balance.netcdf.radiation_netcdf import RadiationNetCDF
from energy_balance.netcdf.radiation_quality_control import RadiationQualityControl

def arg_parse():
    parser = argparse.ArgumentParser()

    parser.add_argument('-s', '--start-date',
                        type=str,
                        required=True,
                        help="The start date to create netCDF files for. e.g. '2021-07-30' when creating daily files, '2021-07' when creating monthly files.")

    parser.add_argument('-e', '--end-date',
                        type=str,
                        required=False,
                        help="The end date to create netCDF files for. e.g. '2021-07-30' when creating daily files, '2021-07' when creating monthly files. This is inclusive.")

    parser.add_argument('-f', '--frequency',
                        type=str,
                        required=True,
                        default='monthly',
                        choices=['daily', 'monthly'],
                        help="The frequency for creating the netCDF files, options are daily or monthly.")

    parser.add_argument('-d', '--data-product',
                        type=str,
                        required=True,
                        choices=['soil', 'radiation'],
                        help="The data product to create files for.")

    return parser.parse_args()

[docs]def create_soil_files(date, frequency): """ Create soil netcdf. :param date: (datetime.datetime) The date for which to create the file. :param frequency: (str) The frequency for files - daily or monthly. :returns: None """ sqc = SoilQualityControl(date, frequency) SoilNetCDF(sqc.df, sqc.qc, date, frequency)
[docs]def create_radiation_files(date, frequency): """ Create radiation netcdf. :param date: (datetime.datetime) The date for which to create the file. :param frequency: (str) The frequency for files - daily or monthly. :returns: None """ rqc = RadiationQualityControl(date, frequency) RadiationNetCDF(rqc.df, rqc.qc, date, frequency)
[docs]def get_create_file(data_product): """Get the function for creating files for the specified data product.""" if data_product == "radiation": return create_radiation_files elif data_product == "soil": return create_soil_files
[docs]def create_files(start_date, end_date, frequency, data_product): """ Create netcdf files for the specified data product in the time range provided. If no data product is provided, netcdf files are created for soil and radiation. :param start_date: (datetime.datetime) The start date for which to create the files. :param end_date: (datetime.datetime) The end date for which to create the files. :param frequency: (str) The frequency for files - daily or monthly. :param data_product: (str) The data product to create the netcdf files for e.g. radiation or soil :returns: None """ while start_date <= end_date: if frequency == 'daily': delta = relativedelta(days=1) else: delta = relativedelta(months=1) try: func = get_create_file(data_product) func(start_date, frequency) except FileNotFoundError: start_date += delta continue start_date += delta
def main(): args = arg_parse() freq = args.frequency if freq == 'daily': date_format = "%Y-%m-%d" else: date_format = "%Y-%m" try: start_date = datetime.strptime(args.start_date, date_format) except ValueError: raise ValueError("Dates must be in a format matching the frequency: Y-m-d for daily, Y-m for monthly.") # if no end date, make it the same as the start date, then file will be created if args.end_date: end_date = datetime.strptime(args.end_date, date_format) complete_stmnt = f'Files created for {args.start_date} {args.end_date}' else: end_date = start_date complete_stmnt = f'File created for {args.start_date}' data_product = args.data_product create_files(start_date, end_date, freq, data_product) print(complete_stmnt) if __name__ == '__main__': main()