Source code for fact.time

''' some functions to deal with FACT modified modified julian date

The time used most of the time in FACT is the number of days since 01.01.1970

So this time is related to unix time, since it has the same offset
(unix time is the number of seconds since 01.01.1970
(what time? noon? midnight??))
but it is also related to 'the' Modified Julian Date (MJD),
which is used by astronomers
in the sense, that it also counts days.

According to http://en.wikipedia.org/wiki/Julian_day,
there is quite a large number of
somehow modified julian dates, of which the MJD is only one.
So it might be okay, to introduce a new modification,
going by the name of FACT Julain Date (FJD).
'''
from __future__ import print_function, division
import time
import calendar
from datetime import datetime, timedelta
import logging

import dateutil
import dateutil.parser

import pandas as pd

OFFSET = (datetime(1970, 1, 1) - datetime(1, 1, 1)).days


[docs]def fjd(datetime_inst): ''' convert datetime instance to FJD ''' if datetime_inst.tzinfo is None: logging.warning('datetime instance is not aware of its timezone.' 'result possibly wrong!') return calendar.timegm(datetime_inst.utctimetuple()) / (24. * 3600.)
[docs]def iso2dt(iso_time_string): ''' parse ISO time string to timezone aware datetime instance example 2015-01-23T08:08+01:00 ''' datetime_inst = dateutil.parser.parse(iso_time_string) # make aware at any cost! if datetime_inst.tzinfo is None: logging.info('ISO time string did not contain timezone info. I assume UTC!') datetime_inst = datetime_inst.replace(tzinfo=dateutil.tz.tzutc()) return datetime_inst
[docs]def run2dt(run_string): ''' parse typical FACT run file path string to datetime instance (UTC) example first you do this: '/path/to/file/20141231.more_text' --> '20141231' then call run2dt('20141231') ''' format_ = '%Y%m%d' datetime_inst = datetime.strptime(run_string, format_) datetime_inst = datetime_inst.replace(tzinfo=dateutil.tz.tzutc()) return datetime_inst
[docs]def facttime(time_string): ''' conver time-string to fact time ''' return calendar.timegm(time.strptime( time_string, '%Y%m%d %H:%M')) / (24. * 3600.)
[docs]def to_datetime(fact_julian_date): ''' convert facttime to datetime instance ''' unix_time = fact_julian_date * 24 * 3600 datetime_inst = datetime.utcfromtimestamp(unix_time) return datetime_inst
[docs]def datestr(datetime_inst): ''' make iso time string from datetime instance ''' return datetime_inst.isoformat('T')
[docs]def night(timestamp=None): ''' gives the date for a day change at noon instead of midnight ''' if timestamp is None: timestamp = datetime.utcnow() if timestamp.hour < 12: timestamp = timestamp - timedelta(days=1) return timestamp
[docs]def night_integer(date): ''' return FACT night integer for date ''' date -= pd.Timedelta(days=0.5) night_int = date.year * 10000 + date.month * 100 + date.day return night_int