Source code for fastwater.general.timeFuncs
# -*- coding: utf-8 -*-
"""
Functions for manipulating time variables associated with *in situ* measurment
and modelled data.
"""
# ----------------------------------------------------------------------------
# IMPORTS
# ----------------------------------------------------------------------------
# Standard Python Dependencies
from datetime import datetime
import numpy as np
# Non-Standard Python Dependencies
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, timeEnd):
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, timeUnits=stdTimeUnits, timeFmt=stdTimeFmt):
if dateNum.size == 1:
date = num2date(dateNum, timeUnits).strftime(timeFmt)
else:
date = [num2date(d, timeUnits).strftime(timeFmt) for d in dateNum]
return date
[docs]def dateNumFromStr(dateStr,
timeUnits=stdTimeUnits,
timeFmt=stdTimeFmt,
calendar=stdCalendar):
dt = datetime.strptime(dateStr, timeFmt)
dateNum = date2num(dt, timeUnits, calendar)
return dateNum
[docs]def matlab2std(dateNum, isLeapYear):
# 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):
# 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