]> AND Private Git Repository - predictops.git/blobdiff - predictops/source/ephemeris.py
Logo AND Algorithmique Numérique Distribuée

Private GIT Repository
Refactoring, fin du lever/coucher de soleil, et début de sentinelles
[predictops.git] / predictops / source / ephemeris.py
index 33c0f2d31f2ff26beb7dcced68cc08033c495ea1..e04a41a46470d7981db259b42c0ba833c8c53639 100644 (file)
@@ -1,31 +1,68 @@
+from astral import LocationInfo
+from astral.sun import sun
+from configparser import ConfigParser
 from datetime import datetime, timedelta
 from datetime import datetime, timedelta
-import time
+from logging import getLogger
+from logging.config import fileConfig
+from pathlib import Path
+
 import calendar
 import calendar
+import pytz
+import time
+
+fileConfig((Path.cwd() / 'config') / 'logging.cfg')
+logger = getLogger()
+
 
 class Ephemeris:
 
 
 class Ephemeris:
 
-    def __init__(self, start = time.strptime('19960101000000', '%Y%m%d%H%M%S'),
-                 end = datetime.now(), features = []):
+    _start = None
+    _end = None
+
+    def __init__(self, config_file, start, end):
+
+        self._config = ConfigParser()
+        self._config.read(config_file)
+
+        self._city = LocationInfo("Besançon", "France", "Europe/Paris", 47.237829, -6.0240539)
         self._start = start
         self._end = end
         self._start = start
         self._end = end
-        self._features = features
+        # Collecting ephemeris features
+        self._features = [section for section in self._config
+                          if self._config[section].getboolean('binary')
+                          or self._config[section].getboolean('categorical')
+                          or self._config[section].getboolean('numerical')]
 
         self._dated_features = {}
 
 
         self._dated_features = {}
 
+    @property
+    def start(self):
+        return self._start
 
 
+    @start.setter
+    def start(self, x):
+        self._start = x
 
 
-    def update(self):
-        pass
-
+    @property
+    def end(self):
+        return self._end
 
 
+    @end.setter
+    def end(self, x):
+        self._end = x
 
     @property
     def dated_features(self):
         if self._dated_features == {}:
 
     @property
     def dated_features(self):
         if self._dated_features == {}:
+            logger.info("Adding ephemeris features")
+            paris = pytz.timezone('Europe/Paris')
             date = self._start
             while date <= self._end:
             date = self._start
             while date <= self._end:
+                datel = paris.localize(date)
                 dict_hour = {}
                 Date = time.strptime(datetime.strftime(date, '%m/%d/%Y %H:%M:%S'), '%m/%d/%Y %H:%M:%S')
                 dict_hour = {}
                 Date = time.strptime(datetime.strftime(date, '%m/%d/%Y %H:%M:%S'), '%m/%d/%Y %H:%M:%S')
+                s = sun(self._city.observer, date=date,
+                        tzinfo=pytz.timezone('Europe/Paris'))
                 for feature in self._features:
                     if feature == 'hour':
                         dict_hour['hour'] = Date.tm_hour
                 for feature in self._features:
                     if feature == 'hour':
                         dict_hour['hour'] = Date.tm_hour
@@ -41,12 +78,23 @@ class Ephemeris:
                         # Si c'est une année bissextile et qu'on est après le 29 février, on compte une journée
                         # dans l'année de moins, car on va supprimer les 29 févriers, de sorte que les 14 juillets,
                         # les 24 décembre... tombent toujours
                         # Si c'est une année bissextile et qu'on est après le 29 février, on compte une journée
                         # dans l'année de moins, car on va supprimer les 29 févriers, de sorte que les 14 juillets,
                         # les 24 décembre... tombent toujours
-                        if calendar.isleap(Date.tm_year) and Date >= time.strptime("29/02/"+str(Date.tm_year), "%d/%m/%Y"):
-                            dict_hour['dayInYear'] = Date.tm_yday -1
+                        if calendar.isleap(Date.tm_year) and Date >= time.strptime("29/02/" + str(Date.tm_year), "%d/%m/%Y"):
+                            dict_hour['dayInYear'] = Date.tm_yday - 1
                         else:
                             dict_hour['dayInYear'] = Date.tm_yday
                     elif feature == 'weekInYear':
                         dict_hour['weekInYear'] = date.isocalendar()[1]
                         else:
                             dict_hour['dayInYear'] = Date.tm_yday
                     elif feature == 'weekInYear':
                         dict_hour['weekInYear'] = date.isocalendar()[1]
+                    elif feature == 'sunRised':
+                        dict_hour['sunRised'] = (datel >= s["sunrise"] - timedelta(minutes=30)
+                                                 and datel <= s["sunset"] - timedelta(minutes=30))
+                    elif feature == 'noon':
+                        dict_hour['noon'] = (datel.hour == s["noon"].hour)
+                    elif feature == 'night':
+                        dict_hour['night'] = (datel <= s["dawn"] - timedelta(minutes=30)
+                                              or datel >= s["dusk"] - timedelta(minutes=30))
+                    elif feature == 'daylightSavingTime':
+                        dict_hour['daylightSavingTime'] = (datel.dst() == timedelta(0))
+
                 self._dated_features[date] = dict_hour
                 date += timedelta(hours=1)
                 self._dated_features[date] = dict_hour
                 date += timedelta(hours=1)
-        return self._dated_features
\ No newline at end of file
+        return self._dated_features