Source code for openghg.standardise.flux_timeseries._crf
import numpy as np
from pathlib import Path
from typing import Dict, Optional, Union
from openghg.store import infer_date_range
[docs]
def parse_crf(
filepath: Path,
species: str,
source: str = "anthro",
region: str = "UK",
domain: Optional[str] = None,
data_type: str = "flux_timeseries",
database: Optional[str] = None,
database_version: Optional[str] = None,
model: Optional[str] = None,
period: Optional[Union[str, tuple]] = None,
continuous: bool = True,
) -> Dict:
"""
Parse CRF emissions data from the specified file.
Args:
filepath: Path to the '.xlsx' file containing CRF emissions data.
species: Name of species
source: Source of the emissions data, e.g. "energy", "anthro", default is 'anthro'.
region: Region/Country of the CRF data
domain: Geographic domain, default is 'None'. Instead region is used to identify area
data_type: Type of data, default is 'flux_timeseries'.
database: Database name if applicable.
database_version: Version of the database if applicable.
model: Model name if applicable.
period: Period of measurements. Only needed if this can not be inferred from the time coords
If specified, should be one of:
- "yearly", "monthly"
- suitable pandas Offset Alias
- tuple of (value, unit) as would be passed to pandas.Timedelta function
continuous: Whether time stamps have to be continuous.
Returns:
Dict: Parsed flux timeseries data in dictionary format.
"""
import pandas as pd
from openghg.util import timestamp_now
# Dictionary of species corresponding to sheet names
sheet_selector = {"ch4": "Table10s3", "co2": "Table10s1", "n2o": "Table10s4", "hfc": "Table10s5"}
# Creating dataframe based on species name
if species.lower() in sheet_selector:
dataframe = pd.read_excel(filepath, sheet_name=sheet_selector[species.lower()], skiprows=4)
else:
raise ValueError(f"Species {species} is incorrect. Please select from {list(sheet_selector.keys())}")
if species.lower() == "co2" or species.lower() == "hfc":
dataframe = dataframe.iloc[1]
else:
dataframe = dataframe.iloc[49]
dataframe = pd.DataFrame(dataframe).iloc[2:-1]
dataframe = dataframe.rename(columns={dataframe.columns[0]: "flux_timeseries"}).astype(np.floating)
dataframe.index = pd.to_datetime(dataframe.index, format="%Y")
metadata = {}
metadata["species"] = species
if domain is not None:
metadata["domain"] = domain
metadata["source"] = source
optional_keywords = {"database": database, "database_version": database_version, "model": model}
for key, value in optional_keywords.items():
if value is not None:
metadata[key] = value
author_name = "OpenGHG Cloud"
metadata["author"] = author_name
metadata["data_type"] = data_type
metadata["processed"] = str(timestamp_now())
metadata["source_format"] = "crf"
dataframe = dataframe.rename_axis("time")
dataarray = dataframe.to_xarray()
dataarray = dataarray.assign_coords(time=dataarray.time)
start_date, end_date, period_str = infer_date_range(
dataarray.time, filepath=filepath, period=period, continuous=continuous
)
metadata["start-date"] = str(start_date)
metadata["end-date"] = str(end_date)
metadata["period"] = str(period_str)
metadata["region"] = region
key = "_".join((species, source, region))
flux_timeseries_data: Dict[str, dict] = {}
flux_timeseries_data[key] = {}
flux_timeseries_data[key]["data"] = dataarray
flux_timeseries_data[key]["metadata"] = metadata
return flux_timeseries_data