josephhardinee / PyDSD

Python Library for working with disdrometer data.
GNU Lesser General Public License v2.1
45 stars 33 forks source link

Feature Request: Build a DSD from non-supported format #108

Open iancornejo opened 1 year ago

iancornejo commented 1 year ago

I appreciate all the built in file readers, but for instances where I apply qc to raw parsivel data and then try to read it in, I need to convert to something akin to ARM's formatting:

def read_precip(nc):
    try:
        nc_temp.close()
        os.remove("temp.nc")
    except:
        pass
    nc_temp = Dataset("temp.nc","w")

    time = nc_temp.createDimension("time",1440)
    particle_size = nc_temp.createDimension("particle_size",32)
    raw_fall_velocity = nc_temp.createDimension("raw_fall_velocity",32)

    time_ = nc_temp.createVariable("time","f4",("time")); 
    time_.units = "seconds since 1970-01-01 00:00:00 0:00"
    time_[:] = date2num(num2date(nc.variables["time"][:],nc.variables["time"].units),units=time_.units)

    Nd_ = nc_temp.createVariable("number_density_drops","f4",("time","particle_size"));
    Nd_[:] = np.nansum(nc.variables["num_conc_rain"][:],axis = 1)

    vel_ = nc_temp.createVariable("fall_velocity_calculated","f4",("particle_size"));
    vel_[:] = v_gk(nc.variables["particle_size"][:])/100

    rr_ = nc_temp.createVariable("precip_rate","f4",("time"));
    rr_[:] = nc.variables["rain_rate_qc"][:]

    spec_ = nc_temp.createVariable("raw_spectrum","f4",("time","particle_size","raw_fall_velocity"))
    spec_[:] = np.moveaxis(nc.variables["qc_spectrum"][:], 1, 2)

    raw_velo_ = nc_temp.createVariable("raw_fall_velocity","f4",("raw_fall_velocity"))
    raw_velo_[:] = nc.variables["raw_fall_velocity"][:]

    dia_ = nc_temp.createVariable("particle_size","f4",("particle_size"))
    dia_[:] = nc.variables["particle_size"][:]

    width_ = nc_temp.createVariable("class_size_width","f4",("particle_size"))
    width_[:] = nc.variables["particle_size_bin_width"][:]

    try:
        return(pydsd.read_parsivel_arm_netcdf("temp.nc"))
    finally:
        nc_temp.close()
        os.remove("temp.nc")

This isn't a huge problem, but being able to just build the dsd object with fields from non-supported file types would be great.