irfpy.util.utc
¶
Universal time related module.
Code author: Yoshifumi Futaana
Warning
Version 3.3.0 of matplotlib
changed the num2date
functionality
in a backward incompatible way.
https://matplotlib.org/3.3.1/api/dates_api.html
This influence the time handling in this module.
Upgrade irfpy.util
to v4.6 or higher.
pip install --find-links=https://irfpy.irf.se/sdist irfpy.util -U
The module has functionalities of:
conversion among many formats in the universal time
production of regularly gridded time interval
Conversion This contais functionality of connverting among UTC-epoch, datetime, Julday, and matlab time.
You may also be interested in Matplotlib’s package matplotlib.dates
where several similar functions are defined.
From To |
String expression |
UTC epoch |
datetime.datetime |
julday.Julday |
matplotlib float |
matlab float |
---|---|---|---|---|---|---|
String expression |
dateutil.parser.parse() |
|||||
UTC epoch |
dateutime.datetime.fromtimestamp() |
|||||
datetime.datetime |
obj.strftime() |
obj.timestamp() |
||||
julday.Julday |
||||||
matplotlib float |
||||||
matlab float |
Todo
Fill in the table specifying the conversion of times.
Todo
Refactor the functions to coordinate the consistency in the function names for time conversion.
Regular gridding
irfpy.util.utc.dtrange()
: Return a list of equally-gridded datetime objectsirfpy.util.utc.trange()
: Return a generator of equally-gridded datetime objects
- irfpy.util.utc.num2date(number)¶
Convert the days from the epoch to the datetime object.
The epoch is always 0001-01-01 (January 1st, year 1 AD), and the number is in days, but with 1 added.
Note that the epoch in matplotlib’s num2date is configurable after v3.3.0. This method can be used regardless of the setting.
- Parameters:
number – Days after the epoch (0001-01-01). It should be 1 or more.
- Returns:
The
datetime.datetime
object corresponding to the number
>>> print(num2date(1)) 0001-01-01 00:00:00+00:00
- irfpy.util.utc.date2num(dt)¶
Convert the days from the epoch to the datetime object.
The epoch is always 0001-01-01 (January 1st, year 1 AD), and the number is in days, but with 1 added.
Note that the epoch in matplotlib’s num2date is configurable after v3.3.0. This method can be used regardless of the setting.
- Parameters:
dt – The
datetime.datetime
objectnumber – Days after the epoch (0001-01-01) plus 1. It should be 1 or more.
>>> print(date2num(datetime.datetime(1, 1, 1))) 1.0 >>> t = datetime.datetime(2006, 12, 2, 15, 30, 0) >>> print(date2num(t)) 732647.6458... >>> print(num2date(date2num(t))) 2006-12-02 15:30:00+00:00
- irfpy.util.utc.datestr2mplnum(string_date)[source]¶
Date expression of string to maplotlib.dates float
It may be similar to
matplotlib.dates.datestr2num()
but when used in np.genfromtxt converter, the datestr2num fails due to the toordinary conversion exception.Warning
After v3.3.0 of Matplotlib, the matplotlib epoch was changed and configurable.
The example below is for pre-3.3.0 Matplotlib behavior.
>>> s = '2014-10-30T15:27:13.332' >>> n1 = datestr2mplnum(s) >>> print(n1) 735536.6439043055 >>> n2 = mpldates.datestr2num(s) >>> print(n2) 735536.6439043055
- irfpy.util.utc.dt2tt(dt)[source]¶
Convert datetime object to the UNIX epoch time
>>> dt2tt(datetime.datetime(1970, 1, 1)) 0.0
- irfpy.util.utc.tt2dt(tt)[source]¶
Convert the UNIX epoch time to datetime instance
>>> print(tt2dt(0.0)) 1970-01-01 00:00:00
- irfpy.util.utc.dt2jd(dt)[source]¶
Convert datetime object to irfpy.util.julday.Julday object.
>>> jd = dt2jd(datetime.datetime(1970, 1, 1)) >>> print(jd) 2440587.50000(1970-01-01T00:00:00.000)
- irfpy.util.utc.jd2dt(jd)[source]¶
Convert irfpy.util.julday.Julday object to datetime.datetime object
>>> from irfpy.util import julday >>> jd = julday.Julday(1970, 1, 1, 0, 0, 0.0) >>> print(jd) 2440587.50000(1970-01-01T00:00:00.000) >>> print(jd2dt(jd)) 1970-01-01 00:00:00
- irfpy.util.utc.tt2jd(tt)[source]¶
Convert the UNIX epoch time to Julius day
>>> print(tt2jd(0)) 2440587.50000(1970-01-01T00:00:00.000)
- irfpy.util.utc.jd2tt(jd)[source]¶
Convert the julian day to UNIX epoch time
>>> from irfpy.util import julday >>> jd = julday.Julday(1970, 1, 1, 0, 0, 0.0) >>> print(jd) 2440587.50000(1970-01-01T00:00:00.000) >>> print(jd2tt(jd)) 0.0
- irfpy.util.utc.mat2dt(matlabtime, remove_tz=True)[source]¶
Convert matlab floating time to
datetime.datetime
instance.- Parameters:
matlabtime (
float
) – Matlab time.remove_tz (
boolean
) – Time zone (UTC) is removed if set True. Keep as it was if set False.num2data
function add tzinfo as UTC, while most of theirfpy
library does not. So by default, the information will be removed.
Matlab time is a
float
and similar to Julian day, but offset is different. Alsomatplotlib
has different offset. Thus, this method will convert Matlab time todatatime.datetime
instance.To convert
matplotlib
time todatetime.datetime
, you can usematplotlib.dates.num2date
method.- Parameters:
matlabtime – Matlab time
- Returns:
datetime.datetime
>>> from irfpy.util.utc import num2date, date2num >>> mattime = 733408 # corresponding to 2008-01-01 00:00:00 >>> pytime = mat2dt(mattime) >>> print(pytime.strftime('%F %T')) 2008-01-01 00:00:00
>>> print(pytime.strftime('%F %T %Z').strip()) 2008-01-01 00:00:00
>>> pytime2 = mat2dt(mattime, remove_tz=False) >>> print(pytime2.strftime('%F %T %Z')) 2008-01-01 00:00:00 UTC
>>> mpltime = date2num(pytime) # If you use matplotlib time, take care! >>> print('%.1f' % mpltime) # This is different from mattime by 366 days. 733042.0
- irfpy.util.utc.dt2mat(dt)[source]¶
Convert the datetime.datetime instance to matlab floating time.
Note that the function will return matlab time, not matplotlib time. They have a difference by 366.
>>> t = datetime.datetime(2006, 12, 2, 15, 30, 0) >>> tmat = dt2mat(t) >>> print(tmat) 733013.645833... >>> trev = mat2dt(tmat) >>> print(trev) 2006-12-02 15:30:00
If you use date2num in matplotlib.dates module, you will get 366 day difference. This is matplotlib time. >>> print(date2num(t)) # doctest: +ELLIPSIS 732647.645833…
- irfpy.util.utc.convert(intime, outfmt=<class 'float'>)[source]¶
Convert between irfpy.util.julday.Julday, datetime.datetime, and time_t.
- Parameters:
intime – Time in supported format.
outfmt – Specify the format. irfpy.util.julday.Julday, datetime, and time_t(float) is supported. Default is time_t.
Supporeted time format is
irfpy.util.julday.Julday
,datetime.datetime
and time_t (=float). Matplotlib’s number (also float) is NOT supported.
- irfpy.util.utc.doy2ymd(year, doi)[source]¶
Convert the day of year to the calendar day as a tuple of (month, day).
If the speicified doy does not exist for the specified year, ValueError is raised.
- irfpy.util.utc.dtrange(t0, t1, dt)[source]¶
Return the equally stepped datetime object.
Return the equally separated datatime objects between t0 and t1 (exclusive) with a step of dt.
Indeed, this is an alias to
irfpy.util.timeseries.dtrange()
.>>> t0 = datetime.datetime(2014, 10, 1) >>> t1 = datetime.datetime(2014, 10, 10) >>> dt = datetime.timedelta(hours=12) >>> tlist = dtrange(t0, t1, dt) >>> print(len(tlist)) 18 >>> print(tlist[5]) 2014-10-03 12:00:00 >>> print(tlist[-1]) 2014-10-09 12:00:00
- irfpy.util.utc.dtlinspace(t0, t1, ndiv)[source]¶
Return the equally separated datetime objects.
- Parameters:
t0 – Start time
t1 – Stop time
ndiv – Number of elements
- Returns:
A list of datetime object
- irfpy.util.utc.trange(t0, t1, dt)[source]¶
Generator of equally separated datetime object.
>>> t0 = datetime.datetime(2014, 1, 1) >>> t1 = datetime.datetime(2014, 1, 3) >>> dt = datetime.timedelta(hours=12) >>> for t in trange(t0, t1, dt): ... print(t) 2014-01-01 00:00:00 2014-01-01 12:00:00 2014-01-02 00:00:00 2014-01-02 12:00:00
Of course you can by enclosure.
>>> tlist = [t.strftime('%FT%T') for t in trange(t0, t1, dt)] >>> print(tlist) ['2014-01-01T00:00:00', '2014-01-01T12:00:00', '2014-01-02T00:00:00', '2014-01-02T12:00:00']