Source code for tds2stac.dimensions.temporal

from datetime import datetime

# SPDX-FileCopyrightText: 2023 Karlsruher Institut für Technologie
#
# SPDX-License-Identifier: CC0-1.0
import pytz


[docs] class Temporal(object):
[docs] def regulator(self, main_dict, temporal_format_by_dataname, data_name): errors = [] warnings = [] if temporal_format_by_dataname is not None: try: main_dict[ "temporal_extent_start_datetime" ] = datetime.strptime( str(data_name), temporal_format_by_dataname ).strftime( "%Y-%m-%dT%H:%M:%S.%fZ" ) except Exception as e: start_datetime = self.safe_strip( main_dict.get("temporal_extent_start_datetime") ) if start_datetime: main_dict[ "temporal_extent_start_datetime" ] = start_datetime warnings.append( f"There is a problem with `temporal_format_by_dataname`. Revise your input. {e.__class__.__name__} : {e}" ) else: errors.append( f"Start DateTime is None or empty in the given dataset. Please review your `tag_config.json` file. {e.__class__.__name__} : {e}" ) else: start_datetime = self.safe_strip( main_dict.get("temporal_extent_start_datetime") ) if start_datetime: main_dict["temporal_extent_start_datetime"] = start_datetime else: errors.append( "Start DateTime is None or empty in the given dataset. Please review your `tag_config.json` file." ) if temporal_format_by_dataname is not None: try: main_dict["temporal_extent_end_datetime"] = datetime.strptime( str(data_name), temporal_format_by_dataname ).strftime("%Y-%m-%dT%H:%M:%S.%fZ") except Exception as e: end_datetime = self.safe_strip( main_dict.get("temporal_extent_end_datetime") ) if end_datetime: main_dict["temporal_extent_end_datetime"] = end_datetime warnings.append( f"There is a problem with `temporal_format_by_dataname`. Revise your input. {e.__class__.__name__} : {e}" ) else: errors.append( f"End DateTime is None or empty in the given dataset. Please review your `tag_config.json` file. {e.__class__.__name__} : {e}" ) else: end_datetime = self.safe_strip( main_dict.get("temporal_extent_end_datetime") ) if end_datetime: main_dict["temporal_extent_end_datetime"] = end_datetime else: errors.append( "End DateTime is None or empty in the given dataset. Please review your `tag_config.json` file." ) # Check if both start and end date-times are present and not just whitespace if all( main_dict.get(key) and not main_dict.get(key).isspace() for key in [ "temporal_extent_start_datetime", "temporal_extent_end_datetime", ] ): # Parse and append start and end date-times to collection_interval_time main_dict["collection_interval_time"].extend( [ self.parse_datetime_with_fallback( main_dict["temporal_extent_start_datetime"], "%Y-%m-%dT%H:%M:%S.%fZ", "%Y-%m-%dT%H:%M:%SZ", pytz.utc, ), self.parse_datetime_with_fallback( main_dict["temporal_extent_end_datetime"], "%Y-%m-%dT%H:%M:%S.%fZ", "%Y-%m-%dT%H:%M:%SZ", pytz.utc, ), ] ) # Sort the collection_interval_time list main_dict["collection_interval_time"].sort() else: # Append error if either start or end datetime is missing or only whitespace errors.append( "Start or End DateTime is None or empty in the given dataset. Please review your `tag_config.json` file." ) if errors != [] and warnings != []: return errors, warnings elif errors != [] and warnings == []: return errors, None elif errors == [] and warnings != []: return None, warnings else: return None, None
# Function to parse datetime with a fallback format
[docs] def parse_datetime_with_fallback( self, datetime_str, primary_format, fallback_format, tzinfo ): try: return datetime.strptime(datetime_str, primary_format).replace( tzinfo=tzinfo ) except ValueError: return datetime.strptime(datetime_str, fallback_format).replace( tzinfo=tzinfo )
[docs] def safe_strip(self, value): return value.strip() if value is not None else ""