defcsv(path:str,encoding:str="utf-8",)->xarray.Dataset:"""ElectricBlue csv data format parser Args: path (str): path to the csv file to parse encoding (str='UTF-8', optional): file encoding Returns: dataset: xarray dataset """withopen(path,encoding=encoding)asf:line=Truemetadata=default_global_attributemetadata["source_file"]=pathwhileline:line=f.readline()metadata["source_file_header"]+=lineline=line.strip()ifre.match(r"^[-,\s]+$",line):continueelifline.startswith("time,"):breakelse:items=line.split(", ",1)key=items[0]value=items[1]iflen(items)==2else""attr=re.sub(r"[\s\[\]\(\)]+","_",key.lower())# cast valueifre.match(r"^[+-]*\d+$",value):value=int(value)elifre.match(r"^[+-]*\d+\.\d+$",value):value=float(value)metadata[attr]=valuecolumns=line.split(",")time_zone=metadata.pop("time_zone")df=pd.read_csv(f,sep=",",header=None,names=columns,converters={0:lambdax:pd.to_datetime(x+time_zone,utc=True)},)iflen(df)!=metadata["samples"]:logger.warning("Parsed data samples=%s do not match expected samples=%s",str(len(df)),metadata["samples"],)# Convert to xarray datasetds=df.to_xarray()# Global attributesds.attrs=metadatads.attrs.update({"instrument_type":ds.attrs.get("envlogger_version"),"instrument_sn":ds.attrs.get("serial_number"),})ds["latitude"]=ds.attrs["lat"]ds["longitude"]=ds.attrs["long"]# Variables attributesforvarinds:ifvarindefault_variable_attributes:ds[var].attrs=default_variable_attributes[var]ds["temp"].attrs["units"]=ds.attrs.pop("temperature")ds=standardize_dataset(ds)returnds