first version of arttools python package

This commit is contained in:
Екатерина Кузнецова 2023-03-13 17:28:47 +03:00
parent a891b29215
commit 511ee043d7
5 changed files with 247 additions and 2 deletions

7
arttools/__init__.py Normal file
View File

@ -0,0 +1,7 @@
# from pkg_resources import get_distribution, DistributionNotFound
# try:
# __version__ = get_distribution(__name__).version
# except DistributionNotFound:
# pass # package is not installed
__version__ = '1.0'

Binary file not shown.

Binary file not shown.

238
arttools/arttime.py Executable file
View File

@ -0,0 +1,238 @@
#!/usr/bin/env python3
# -*- coding: utf8 -*-
from datetime import datetime
import astropy.units as u
from astropy.time.formats import erfa
from astropy.time import Time
from astropy.time import TimezoneInfo
MJDREF = Time(51543.875, format='mjd') #corresponds to date 01.01.2000 00:00:00 (UTC+3)
TZ_UTC = TimezoneInfo(utc_offset=0*u.hour) #UTC time zone
TZ_MSK = TimezoneInfo(utc_offset=3*u.hour) #UTC+3 (Moscow) time zone
class MissionTime(object):
def __init__(self, mtime):
self._mtime = mtime
def get(self):
return self._mtime
def __str__(self):
return str(self._mtime)
def to_datetime(self, tzone=TZ_UTC):
days = self.to_mjd()
return days.to_datetime(timezone=tzone)
def to_artday(self):
ARTDAYLEN = erfa.DAYSEC
return self._mtime / ARTDAYLEN
def to_mjd(self):
mjd_value = MJDREF.mjd + Time(self._mtime / erfa.DAYSEC, format='mjd').mjd
return Time(mjd_value, format='mjd')
class ArtDay(object):
def __init__(self, aday):
self._aday = aday
def get(self):
return self._aday
def __str__(self):
return str(self._aday)
def to_mission(self):
ARTDAYLEN = erfa.DAYSEC
return self._aday * ARTDAYLEN
def to_datetime(self, tzone=TZ_UTC):
days = self.to_mjd()
return days.to_datetime(timezone=tzone)
def to_mjd(self):
mjd_value = MJDREF.mjd + Time(self._aday, format='mjd').mjd
return Time(mjd_value, format='mjd')
class MjdDay(object):
def __init__(self, mjd):
self._mjd = Time(mjd, format='mjd')
def get(self):
return self._mjd
def __str__(self):
return str(self._mjd)
def to_mission(self):
ARTDAYLEN = erfa.DAYSEC
return (self._mjd.mjd - MJDREF.mjd) * ARTDAYLEN
def to_artday(self):
return self._mjd.mjd - MJDREF.mjd
def to_datetime(self, tzone=TZ_UTC):
return Time(self._mjd, format='mjd').to_datetime(timezone=tzone)
class Dtime(object):
def __init__(self, dtime, tzone=None):
dtime = datetime.fromisoformat(dtime)
if tzone is None:
self._dtime = dtime
else:
self._dtime = dtime.replace(tzinfo=tzone)
self._tzone = tzone
def get(self):
return self._dtime
def __str__(self):
return str(self._dtime)
def to_mjd(self):
days = Time(self._dtime)
return days
def to_artday(self):
return self.to_mjd().mjd - MJDREF.mjd
def to_mission(self):
ARTDAYLEN = erfa.DAYSEC
return self.to_artday() * ARTDAYLEN
def to_msk(self):
dtime_utc = Time(self._dtime)
return dtime_utc.to_datetime(timezone=TZ_MSK)
def to_utc(self):
dtime_msk = Time(self._dtime)
return dtime_msk.to_datetime(timezone=TZ_UTC)
class ArtTime(object):
def __init__(self, aday=None, mjd=None, mtime=None, dtime_utc=None, dtime_msk=None):
self._has_value = False
self._try_mtime(mtime)
self._try_aday(aday)
self._try_mjd(mjd)
self._try_dtime_utc(dtime_utc)
self._try_dtime_msk(dtime_msk)
def _try_mtime(self, mtime):
if mtime is None:
return
self._has_value = True
self._mtime = MissionTime(mtime)
self._aday = ArtDay(self._mtime.to_artday())
self._mjd = MjdDay(self._mtime.to_mjd())
self._dtime_utc = Dtime(dtime=str(self._mtime.to_datetime(tzone=TZ_UTC)))
self._dtime_msk = Dtime(dtime=str(self._mtime.to_datetime(tzone=TZ_MSK)))
def _try_aday(self, aday):
if aday is None:
return
self._has_value = True
self._aday = ArtDay(aday)
self._mtime = MissionTime(self._aday.to_mission())
self._mjd = MjdDay(self._aday.to_mjd())
self._dtime_utc = Dtime(dtime=str(self._aday.to_datetime(tzone=TZ_UTC)))
self._dtime_msk = Dtime(dtime=str(self._aday.to_datetime(tzone=TZ_MSK)))
def _try_mjd(self, mjd):
if mjd is None:
return
self._has_value = True
self._mjd = MjdDay(mjd)
self._aday = ArtDay(self._mjd.to_artday())
self._mtime = MissionTime(self._mjd.to_mission())
self._dtime_utc = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_UTC)))
self._dtime_msk = Dtime(dtime=str(self._mjd.to_datetime(tzone=TZ_MSK)))
def _try_dtime_utc(self, dtime_utc):
if dtime_utc is None:
return
self._has_value = True
self._dtime_utc = Dtime(dtime_utc, tzone=TZ_UTC)
self._dtime_msk = Dtime(str(self._dtime_utc.to_msk()))
self._mtime = MissionTime(self._dtime_utc.to_mission())
self._aday = ArtDay(self._dtime_utc.to_artday())
self._mjd = MjdDay(self._dtime_utc.to_mjd())
def _try_dtime_msk(self, dtime_msk):
if dtime_msk is None:
return
self._has_value = True
self._dtime_msk = Dtime(dtime_msk, tzone=TZ_MSK)
self._dtime_utc = Dtime(str(self._dtime_msk.to_utc()))
self._mtime = MissionTime(self._dtime_msk.to_mission())
self._aday = ArtDay(self._dtime_msk.to_artday())
self._mjd = MjdDay(self._dtime_msk.to_mjd())
@property
def mission(self):
return self._mtime
@property
def artday(self):
return self._aday
@property
def mjd(self):
return self._mjd
@property
def date_utc(self):
return self._dtime_utc
@property
def date_msk(self):
return self._dtime_msk
def __str__(self):
aday_str = 'Artday --> '+str(self._aday)+'\n'
mtime_str = 'Mission time --> '+str(self._mtime)+'\n'
mjd_str = 'MJD --> '+str(self._mjd)+'\n'
date_msk_str = 'Date MSK --> '+str(self._dtime_msk)+'\n'
date_utc_str = 'Date UTC --> '+str(self._dtime_utc)+'\n'
return str(aday_str+mtime_str+mjd_str+date_msk_str+date_utc_str)
def main():
atime = ArtTime(dtime_msk='2021-12-12T00:00:00')
print(atime)
print(atime.mission)
print(atime.artday)
print(atime.date_utc)
print(atime.date_msk)
print(atime.mjd)
if __name__ == '__main__':
main()

View File

@ -1,6 +1,6 @@
[metadata]
name = arttime
description = ART-XC time converter
name = arttools
description = ART-XC package
version = 1.0
long_description = file: README.rst
author = Kuznetsova E., Shtykovsky A.