acgc.time

Collection of functions for manipulating times and dates

This module is outdated. These functions can be accomplished with pandas.Timestamp.

@author: cdholmes

  1#!/usr/bin/env python3
  2# -*- coding: utf-8 -*-
  3"""Collection of functions for manipulating times and dates
  4
  5This module is outdated. These functions can be accomplished with pandas.Timestamp.
  6
  7@author: cdholmes
  8"""
  9
 10import time
 11from datetime import datetime as dt
 12from datetime import timedelta as td
 13
 14import numpy as np
 15import pandas as pd
 16
 17
 18def _seconds_since_epoch(datetime):
 19    ''''Compute seconds since start of Unix epoch
 20    
 21    Epoch begins January 1, 1970, 00:00:00 (UTC)
 22    
 23    Parameter
 24    ---------
 25    datetime : datetime.datetime
 26        date and time
 27    
 28    Returns
 29    -------
 30    sec : float
 31        seconds since
 32    '''
 33    return time.mktime(datetime.timetuple())
 34_sinceEpoch = _seconds_since_epoch
 35
 36def date2yearf(datetime):
 37    '''Convert datetime to year with fraction
 38
 39    Parameters
 40    ----------
 41    datetime : datetime.date or datetime.datetime or list/array of same
 42        date and time
 43    
 44    Returns
 45    -------
 46    yearfrac : float or list
 47        year and fraction corresponding to input dates. e.g. 2005.156
 48    '''
 49
 50    yearfrac = []
 51    for d in np.array(datetime):
 52        # Convert numpy datetime64 to datetime
 53        d = pd.to_datetime(d)
 54        # get the year
 55        year = d.year
 56        startOfThisYear = dt(year=year, month=1, day=1)
 57        startOfNextYear = dt(year=year+1, month=1, day=1)
 58        yearElapsed = _sinceEpoch(d) - _sinceEpoch(startOfThisYear)
 59        yearDuration = _sinceEpoch(startOfNextYear) - _sinceEpoch(startOfThisYear)
 60        fraction = yearElapsed/yearDuration
 61
 62        yearfrac.append(d.year + fraction)
 63
 64    # if result has only one value, then convert to scalar
 65    if len(yearfrac)==1:
 66        yearfrac = yearfrac[0]
 67
 68    return yearfrac
 69
 70def yearf2date(yearf,roundSec=True):
 71    '''Convert year with fraction to datetime 
 72
 73    Parameters
 74    ----------
 75    yearfrac : float or list of float
 76        year and fraction, e.g. 2005.156
 77    roundSec : bool (default=True)
 78        specify if output should be rounded to the nearest second
 79        
 80    Returns
 81    -------
 82    date : datetime.datetime or list of same
 83        date and time corresponding to input
 84    '''
 85
 86    s = _sinceEpoch
 87
 88    date = []
 89    for d in [yearf]:
 90        y = np.int(d)
 91        startOfThisYear = dt(year=y,month=1,day=1)
 92        startOfNextYear = dt(year=y+1, month=1, day=1)
 93        yearDuration = s(startOfNextYear) - s(startOfThisYear)
 94        secElapsed = yearDuration * np.mod(d,1)
 95
 96        if roundSec:
 97            secElapsed = np.round(secElapsed)
 98        date.append(startOfThisYear + td(seconds=secElapsed) )
 99
100    # if result has only one value, then convert to scalar
101    if len(date)==1:
102        date = date[0]
103
104    return date
105
106def date2doyf(datetime):
107
108    '''Convert datetime to day of year with fraction
109
110    Parameters
111    ----------
112    datetime : datetime.date or datetime.datetime or list of same
113        date and time
114    
115    Returns
116    -------
117    doyfrac : float or list
118        day of year and fraction corresponding to input dates. e.g. 100.156
119    '''
120
121    s = _sinceEpoch
122
123    doy = []
124    for d in [datetime]:
125
126        year = d.year
127        month = d.month
128        day = d.day
129
130        startOfThisDay = dt(year=year,month=month,day=day)
131        dayElapsed = s(d) - s(startOfThisDay)
132        fraction = dayElapsed/86400.
133
134        doy.append(d.timetuple().tm_yday + fraction)
135
136     # if result has only one value, then convert to scalar
137    if len(doy)==1:
138        doy = doy[0]
139
140    return doy
141
142def doyf2date(doyf,year,roundSec=True):
143    '''Convert day of year with fraction to datetime 
144
145    Parameters
146    ----------
147    doyf : float or list of float
148        day of year and fraction, e.g. 100.156
149    year : float or list of float
150        year
151    roundSec : bool (default=True)
152        specify if output should be rounded to the nearest second
153        
154    Returns
155    -------
156    date : datetime.datetime or list of same
157        date and time corresponding to input
158    '''
159
160    if len(year)==1:
161        year = np.zeros_like(doyf)+year
162
163    date = []
164    for i,d in enumerate(doyf):
165        startOfThisYear = dt(year=year[i],month=1,day=1)
166        secElapsed = (d-1)*86400
167
168        if roundSec:
169            secElapsed = np.round(secElapsed)
170        d = td(seconds=secElapsed)
171        date.append( startOfThisYear + td(seconds=secElapsed) )
172
173    # if result has only one value, then convert to scalar
174    if len(date)==1:
175        date = date[0]
176
177    return date
def date2yearf(datetime):
37def date2yearf(datetime):
38    '''Convert datetime to year with fraction
39
40    Parameters
41    ----------
42    datetime : datetime.date or datetime.datetime or list/array of same
43        date and time
44    
45    Returns
46    -------
47    yearfrac : float or list
48        year and fraction corresponding to input dates. e.g. 2005.156
49    '''
50
51    yearfrac = []
52    for d in np.array(datetime):
53        # Convert numpy datetime64 to datetime
54        d = pd.to_datetime(d)
55        # get the year
56        year = d.year
57        startOfThisYear = dt(year=year, month=1, day=1)
58        startOfNextYear = dt(year=year+1, month=1, day=1)
59        yearElapsed = _sinceEpoch(d) - _sinceEpoch(startOfThisYear)
60        yearDuration = _sinceEpoch(startOfNextYear) - _sinceEpoch(startOfThisYear)
61        fraction = yearElapsed/yearDuration
62
63        yearfrac.append(d.year + fraction)
64
65    # if result has only one value, then convert to scalar
66    if len(yearfrac)==1:
67        yearfrac = yearfrac[0]
68
69    return yearfrac

Convert datetime to year with fraction

Parameters
  • datetime (datetime.date or datetime.datetime or list/array of same): date and time
Returns
  • yearfrac (float or list): year and fraction corresponding to input dates. e.g. 2005.156
def yearf2date(yearf, roundSec=True):
 71def yearf2date(yearf,roundSec=True):
 72    '''Convert year with fraction to datetime 
 73
 74    Parameters
 75    ----------
 76    yearfrac : float or list of float
 77        year and fraction, e.g. 2005.156
 78    roundSec : bool (default=True)
 79        specify if output should be rounded to the nearest second
 80        
 81    Returns
 82    -------
 83    date : datetime.datetime or list of same
 84        date and time corresponding to input
 85    '''
 86
 87    s = _sinceEpoch
 88
 89    date = []
 90    for d in [yearf]:
 91        y = np.int(d)
 92        startOfThisYear = dt(year=y,month=1,day=1)
 93        startOfNextYear = dt(year=y+1, month=1, day=1)
 94        yearDuration = s(startOfNextYear) - s(startOfThisYear)
 95        secElapsed = yearDuration * np.mod(d,1)
 96
 97        if roundSec:
 98            secElapsed = np.round(secElapsed)
 99        date.append(startOfThisYear + td(seconds=secElapsed) )
100
101    # if result has only one value, then convert to scalar
102    if len(date)==1:
103        date = date[0]
104
105    return date

Convert year with fraction to datetime

Parameters
  • yearfrac (float or list of float): year and fraction, e.g. 2005.156
  • roundSec (bool (default=True)): specify if output should be rounded to the nearest second
Returns
  • date (datetime.datetime or list of same): date and time corresponding to input
def date2doyf(datetime):
107def date2doyf(datetime):
108
109    '''Convert datetime to day of year with fraction
110
111    Parameters
112    ----------
113    datetime : datetime.date or datetime.datetime or list of same
114        date and time
115    
116    Returns
117    -------
118    doyfrac : float or list
119        day of year and fraction corresponding to input dates. e.g. 100.156
120    '''
121
122    s = _sinceEpoch
123
124    doy = []
125    for d in [datetime]:
126
127        year = d.year
128        month = d.month
129        day = d.day
130
131        startOfThisDay = dt(year=year,month=month,day=day)
132        dayElapsed = s(d) - s(startOfThisDay)
133        fraction = dayElapsed/86400.
134
135        doy.append(d.timetuple().tm_yday + fraction)
136
137     # if result has only one value, then convert to scalar
138    if len(doy)==1:
139        doy = doy[0]
140
141    return doy

Convert datetime to day of year with fraction

Parameters
  • datetime (datetime.date or datetime.datetime or list of same): date and time
Returns
  • doyfrac (float or list): day of year and fraction corresponding to input dates. e.g. 100.156
def doyf2date(doyf, year, roundSec=True):
143def doyf2date(doyf,year,roundSec=True):
144    '''Convert day of year with fraction to datetime 
145
146    Parameters
147    ----------
148    doyf : float or list of float
149        day of year and fraction, e.g. 100.156
150    year : float or list of float
151        year
152    roundSec : bool (default=True)
153        specify if output should be rounded to the nearest second
154        
155    Returns
156    -------
157    date : datetime.datetime or list of same
158        date and time corresponding to input
159    '''
160
161    if len(year)==1:
162        year = np.zeros_like(doyf)+year
163
164    date = []
165    for i,d in enumerate(doyf):
166        startOfThisYear = dt(year=year[i],month=1,day=1)
167        secElapsed = (d-1)*86400
168
169        if roundSec:
170            secElapsed = np.round(secElapsed)
171        d = td(seconds=secElapsed)
172        date.append( startOfThisYear + td(seconds=secElapsed) )
173
174    # if result has only one value, then convert to scalar
175    if len(date)==1:
176        date = date[0]
177
178    return date

Convert day of year with fraction to datetime

Parameters
  • doyf (float or list of float): day of year and fraction, e.g. 100.156
  • year (float or list of float): year
  • roundSec (bool (default=True)): specify if output should be rounded to the nearest second
Returns
  • date (datetime.datetime or list of same): date and time corresponding to input