Source code for TimeFuncs
# -*- coding: utf-8 -*-
"""
Internal date/time manipulation functions.
These functions are used to standardise the time stamping between data types.
:Dependencies [External]: datetime, netCDF4
:Dependencies [Internal]:
"""
# ----------------------------------------------------------------------------
# IMPORTS
# ----------------------------------------------------------------------------
# Standard Python Dependencies
from datetime import datetime
# Non-Standard Python Dependencies
import numpy as np
from netCDF4 import num2date, date2num
# Local Module Dependencies
# Other Dependencies
# ----------------------------------------------------------------------------
# GLOBAL VARIABLES
# ----------------------------------------------------------------------------
stdTimeUnits = 'days since 0001-01-01 00:00:00'
stdTimeFmt = "%Y-%m-%d %H:%M:%S"
stdCalendar = 'gregorian'
# ----------------------------------------------------------------------------
# CLASS DEFINITIONS
# ----------------------------------------------------------------------------
[docs]class temporalCoverage:
def __init__(self, timeStart: str, timeEnd: str):
self.timeRangeStr = [timeStart, timeEnd]
self.timeRangeNum = [dateNumFromStr(timeStart),
dateNumFromStr(timeEnd)]
self.units = stdTimeUnits
self.format = stdTimeFmt
self.calendar = stdCalendar
[docs] def timeOverlap(self, tRec):
if len(tRec) > 0:
t0 = tRec[0]
t1 = tRec[-1]
case01 = (t0 >= min(self.timeRangeNum)) & \
(t1 <= max(self.timeRangeNum))
case02 = (t0 < min(self.timeRangeNum)) & \
(t1 >= min(self.timeRangeNum))
case03 = (t0 < max(self.timeRangeNum)) & \
(t1 >= max(self.timeRangeNum))
case04 = (t0 < min(self.timeRangeNum)) & \
(t1 > max(self.timeRangeNum))
overlaps = case01 or case02 or case03 or case04
if overlaps:
tindx0 = np.where(tRec >= self.timeRangeNum[0])[0][0]
tindx1 = np.where(tRec <= self.timeRangeNum[1])[0][-1]
indices = [tindx0, tindx1]
else:
indices = [None, None]
else:
overlaps = False
indices = [None, None]
return overlaps, indices
# ----------------------------------------------------------------------------
# FUNCTION DEFINITIONS
# ----------------------------------------------------------------------------
[docs]def dateStr(dateNum):
if dateNum.size == 1:
date = num2date(dateNum, stdTimeUnits).strftime()
else:
date = [num2date(d, stdTimeUnits).strftime() for d in dateNum]
return date
[docs]def dateNumFromStr(dateStr):
dt = datetime.strptime(dateStr, stdTimeFmt)
dateNum = date2num(dt, stdTimeUnits, stdCalendar)
return dateNum
[docs]def matlab2std(dateNum, isLeapYear: bool):
# need check to ensure dateNum is in days
if isLeapYear:
dn = dateNum - 366.0
else:
dn = dateNum - 365.0
return dn
[docs]def std2matlab(dateNum, isLeapYear: bool):
# need check to ensure dateNum is in days
if isLeapYear:
dn = dateNum + 366.0
else:
dn = dateNum + 365.0
return dn
[docs]def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
else:
return False