decisionai_plugin/common/util/timeutil.py (97 lines of code) (raw):

from dateutil import parser, tz import datetime import dateutil from .constant import MINT_IN_SECONDS, HOUR_IN_SECONDS, DAY_IN_SECONDS from .gran import Gran DT_FORMAT = '%Y-%m-%dT%H:%M:%SZ' DT_FILENAME_FORMAT = '%Y-%m-%dT_%H_%M_%SZ' def convert_freq(gran, custom_in_seconds): if gran == Gran.Yearly: return 'Y' if gran == Gran.Monthly: return 'M' if gran == Gran.Weekly: return 'W' if gran == Gran.Daily: return 'D' if gran == Gran.Hourly: return 'H' if gran == Gran.Minutely: return 'T' if gran == Gran.Secondly: return 'S' return '{}S'.format(custom_in_seconds) def str_to_dt(s): return parser.parse(s).replace(tzinfo=tz.UTC) def dt_to_str(dt): return dt.strftime(DT_FORMAT) def dt_to_str_file_name(dt): return dt.strftime(DT_FILENAME_FORMAT) def get_diff(start, graninfo, end): (gran_str, custom_in_seconds) = graninfo delta = dateutil.relativedelta.relativedelta(end, start) if gran_str == 'Daily': diff = (end - start).total_seconds() / DAY_IN_SECONDS elif gran_str == 'Weekly': diff = (end - start).total_seconds() / (DAY_IN_SECONDS * 7) elif gran_str == 'Monthly': diff = delta.years * 12 + delta.months elif gran_str == 'Yearly': diff = delta.years elif gran_str == 'Hourly': diff = (end - start).total_seconds() / HOUR_IN_SECONDS elif gran_str == 'Minutely': diff = (end - start).total_seconds() / MINT_IN_SECONDS elif gran_str == 'Secondly': diff = (end - start).total_seconds() elif gran_str == 'Custom': diff = (end - start).total_seconds() / custom_in_seconds else: raise Exception('Granularity not supported: {}|{}'.format(*graninfo)) return int(diff) def get_time_offset(timestamp, graninfo, offset): (gran_str, custom_in_seconds) = graninfo if gran_str == 'Daily': return timestamp + datetime.timedelta(days=offset) elif gran_str == 'Weekly': return timestamp + datetime.timedelta(weeks=offset) elif gran_str == 'Monthly': return timestamp + dateutil.relativedelta.relativedelta(months=offset) elif gran_str == 'Yearly': return timestamp + dateutil.relativedelta.relativedelta(years=offset) elif gran_str == 'Hourly': return timestamp + datetime.timedelta(hours=offset) elif gran_str == 'Minutely': return timestamp + datetime.timedelta(minutes=offset) elif gran_str == 'Secondly': return timestamp + datetime.timedelta(seconds=offset) elif gran_str == 'Custom': return timestamp + datetime.timedelta(seconds=custom_in_seconds * offset) else: raise Exception('Granularity not supported: {}|{}'.format(*graninfo)) def get_time_list(start_time, end_time, graninfo): time_list = [] (gran_str, custom_in_seconds) = graninfo offset = 1 if gran_str == 'Daily': timedelta = datetime.timedelta(days=offset) elif gran_str == 'Weekly': timedelta = datetime.timedelta(weeks=offset) elif gran_str == 'Monthly': timedelta = dateutil.relativedelta.relativedelta(months=offset) elif gran_str == 'Yearly': timedelta = dateutil.relativedelta.relativedelta(years=offset) elif gran_str == 'Hourly': timedelta = datetime.timedelta(hours=offset) elif gran_str == 'Minutely': timedelta = datetime.timedelta(minutes=offset) elif gran_str == 'Secondly': timedelta = datetime.timedelta(seconds=offset) elif gran_str == 'Custom': timedelta = datetime.timedelta(seconds=custom_in_seconds * offset) else: raise Exception('Granularity not supported: {}|{}'.format(*graninfo)) while start_time <= end_time: time_list.append(start_time) start_time = start_time + timedelta return time_list