Source code for lilio._attrs

from datetime import datetime
from datetime import timezone
from typing import Union
import xarray as xr
import lilio
from lilio.calendar import Calendar


[docs] def add_attrs(data: Union[xr.DataArray, xr.Dataset], calendar: Calendar) -> None: """Update resampled xarray data with the Calendar's attributes and provenance.""" history = ( f"{datetime.now(timezone.utc):%Y-%m-%d %H:%M:%S %Z} - " "Resampled with a Lilio calendar. " "See: https://github.com/AI4S2S/lilio\n" ) if "history" in data.attrs.keys(): history += data.attrs["history"] data.attrs = { **data.attrs, # Keep original attrs. Conflicts will be overwritten attrs below: "lilio_version": lilio.__version__, "lilio_calendar_anchor_date": calendar.anchor, "lilio_calendar_code": str(calendar), "history": history, } data["anchor_year"].attrs = { "name": "anchor year", "units": "year", "description": ( "The anchor date is the start of the period you want to forecast, and is " "an abstract date and does not include a year. " "Anchor years are used to create a full date with the anchor date " f"(here: {calendar.anchor})." ), } data["i_interval"].attrs = { "name": "interval index", "units": "-", "description": ( "The index of each Lilio Calendar interval. Positive values denote " "intervals after the anchor date (targets), while negative values " "represent intervals before the anchor date (precursors)." ), } data["is_target"].attrs = { "name": "Target flag", "description": ( "Denotes if an interval was marked as a target interval in the" " Lilio Calendar." ), }