Project

General

Profile

Multiply different values to timeseries data

Added by Suvarna Tikle over 1 year ago

Dear All,
I have variable res data for 14 months. Would like to apply various factors for each month. Example , Dec*12,Jan*1,Feb*2 etc.
I am trying to write bash script but how to apply separate factor for different months. Can one help me to correct the code?


#!/bin/bash
module load cdo
cdo splityear tonns_gridarea_fixgrid_Mul_res_CAMS_LE_Indore.nc month_%.nc  # split the input file by year into separate files for each month
for file in month_*.[DJFMAMJJASONDJ]*.nc; do  # loop over the files for each month
    month=$(echo $file | cut -d '_' -f 2)  # extract the month from the filename
    factor=1,2,3,4,5,6,7,8,9,10,11,12,13,14  # set the factor for this month
    cdo expr,"var*$factor" $file factor_${month}_$file  # apply the factor to the data in the file
done
cdo cat factor_* output.nc  # concatenate the files back together into a single output file

Best,
Suvarna


Replies (4)

RE: Multiply different values to timeseries data - Added by Suvarna Tikle over 1 year ago

This is in continuation of earlier query. I also tried with below code but hard luck.

#!/bin/bash
module load cdo
#define the factors for each month
declare -A factors=(
    ["2018-12-01"]=31*60*60*24
    ["2019-01-01"]=31*60*60*24
    ["2019-02-01"]=28*60*60*24
    ["2019-03-01"]=30*60*60*24
    ["2019-04-01"]=30*60*60*24
    ["2019-05-01"]=31*60*60*24
    ["2019-06-01"]=30*60*60*24
    ["2019-07-01"]=31*60*60*24
    ["2019-08-01"]=31*60*60*24
    ["2019-09-01"]=30*60*60*24
    ["2019-10-01"]=31*60*60*24
    ["2019-11-01"]=30*60*60*24
    ["2019-12-01"]=31*60*60*24
    ["2020-01-01"]=31*60*60*24

)
# Loop over each month in the factors array
for month in "${!factors[@]}"; do
    # Define the CDO expression for this month
    expr="$month=${factors[$month]}*${month}" 

    # Apply the expression to the input file and save the output to a temporary file
    cdo expr,"$expr"  tonns_gridarea_fixgrid_Mul_res_CAMS_LE_Indore.nc tmp_$month.nc
done

# Merge the temporary files into a single output file
cdo mergetime tmp_*.nc tonns_monthly_CAMS_NMVOC.nc

# Clean up the temporary files
rm tmp_*.nc
~             

Ncdump of file is-

netcdf tonns_gridarea_fixgrid_Mul_res_CAMS_LE_Indore {
dimensions:
        time = UNLIMITED ; // (14 currently)
        lat = 16 ;
        lon = 20 ;
variables:
        double res(time, lat, lon) ;
                res:cell_method = "time: sum (interval: 1 month comment: gregorian calendar) " ;
                res:long_name = "Emissions of NMVOCs for res sector" ;
                res:molecular_weight = "72" ;
                res:sector_name = "Residential,  commercial and other combustion" ;
                res:standard_name = "tendency_of_atmosphere_mass_content_of_nmvocs_due_to_emissions_from_res_sector" ;
                res:units = "kg m-2 s-1" ;
        float lon(lon) ;
                lon:standard_name = "longitude" ;
                lon:long_name = "longitude" ;
                lon:units = "degrees_east" ;
                lon:axis = "X" ;
        float lat(lat) ;
                lat:standard_name = "latitude" ;
                lat:long_name = "latitude" ;
                lat:units = "degrees_north" ;
                lat:axis = "Y" ;
        double cell_area(lat, lon) ;
                cell_area:standard_name = "area" ;
                cell_area:long_name = "area of grid cell" ;
                cell_area:units = "m2" ;
        float time(time) ;
                time:standard_name = "time" ;
                time:long_name = "time" ;
                time:units = "hours since 1850-01-01 00:00:00" ;
                time:calendar = "gregorian" ;
                time:axis = "T" ;

Best,
Suvarna

RE: Multiply different values to timeseries data - Added by Ralf Mueller over 1 year ago

hi Survana!

you can use the before and after the source code. Than the indentation is more readable

cheers
ralf

RE: Multiply different values to timeseries data - Added by Suvarna Tikle over 1 year ago

#!/bin/bash
module load cdo

  1. Define the factors for each month
    declare -A factors=(
    [2018_12_01]=2678400
    [2019_01_01]=2678400
    [2019_02_01]=2419200
    [2019_03_01]=2592000
    [2019_04_01]=2592000
    [2019_05_01]=2678400
    [2019_06_01]=2592000
    [2019_07_01]=2678400
    [2019_08_01]=2678400
    [2019_09_01]=2592000
    [2019_10_01]=2678400
    [2019_11_01]=2592000
    [2019_12_01]=2678400
    [2020_01_01]=2678400
    )
  1. Loop over each month in the factors array
    for month in "${!factors[@]}"; do
  1. Define the CDO expression for this month
    expr="(${month}_rate=${factors[$month]}*tonns_gridarea_fixgrid_Mul_res_CAMS_LE_Indore)"
  1. Apply the expression to the input file and save the output to a temporary file
    cdo expr,"$expr" tonns_gridarea_fixgrid_Mul_res_CAMS_LE_Indore.nc tmp_${month}_rate.nc
    done
  1. Merge the temporary files into a single output file
    cdo mergetime tmp_*_rate.nc tonns_monthly_CAMS_NMVOC.nc
  1. Clean up the temporary files
    rm tmp_*_rate.nc
    (1-4/4)