Advertisement
martineau

sunriseset.py

Apr 19th, 2021
1,324
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.07 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # -*- coding: iso-8859-1 -*-
  3.  
  4. import datetime
  5. import tzinfo_examples as timezone  # implementation of concrete tzinfo subclass
  6. import math
  7. from sun import Sun
  8.  
  9. __all__ = ['getsuninfo', 'Place']
  10.  
  11. class Place(object):
  12.     def __init__(self, name, coords, tz=timezone.Pacific):
  13.         self.name = name        # string
  14.         self.coords = coords    # tuple (E/W long, N/S lat)
  15.         self.tz = tz            # tzinfo constant
  16.  
  17.  
  18. def _hoursmins(hours):
  19.     """Convert floating point time in hours to integer hrs, mins"""
  20.     frach, h = math.modf(hours)  # get fractional and whole parts
  21.     m = round(frach * 60, 0)     # convert fractional part to whole minutes
  22.     if m == 60:                  # rounded up to whole hour?
  23.         h, m = h + 1, 0
  24.     return int(h), int(m)
  25.  
  26. def _ymd(date):
  27.     """Return y,m,d from datetime object as tuple"""
  28.     return date.timetuple()[:3]
  29.  
  30. def getsuninfo(location, date=None):
  31.     """Return local datetime of sunrise, sunset, and length of day in hrs, mins"""
  32.     querydate = datetime.date.today() if date is None else date
  33.     args = _ymd(querydate) + location.coords
  34.     utcrise, utcset = Sun().sunRiseSet(*args)
  35.     daylength = Sun().dayLength(*args)
  36.     hrs, mins = _hoursmins(daylength)
  37.  
  38.     risehour, risemin = _hoursmins(utcrise)
  39.     sethour, setmin = _hoursmins(utcset)
  40.  
  41.     # convert times to timedelta values (ie from midnight utc of the date)
  42.     midnight = datetime.datetime(tzinfo=timezone.utc, *_ymd(querydate))
  43.     deltarise = datetime.timedelta(hours=risehour, minutes=risemin)
  44.     utcdatetimerise = midnight + deltarise
  45.     deltaset = datetime.timedelta(hours=sethour, minutes=setmin)
  46.     utcdatetimeset = midnight + deltaset
  47.  
  48.     # convert results from UTC to local timezone
  49.     localrise = utcdatetimerise.astimezone(location.tz)
  50.     localset = utcdatetimeset.astimezone(location.tz)
  51.  
  52.     return localrise, localset, hrs, mins
  53.  
  54. if __name__ == "__main__":
  55.     import datetime
  56.     import timezone
  57.  
  58.     def unittest(location, testdate):
  59.         risetime, settime, hrs, mins = getsuninfo(location, testdate)
  60.  
  61.         print("Location: {}".format(location.name))
  62.         print("Date:".format(testdate.strftime("%a %x")))
  63.         print(risetime.strftime("Sunrise %I:%M %p"),
  64.               settime.strftime("- Sunset %I:%M %p (%Z)"))
  65.         print("daylight: %d:%02d" % (hrs, mins))
  66.         print()
  67.  
  68.     place = Place("My House", (-121.990278, 47.204444), timezone.Pacific)
  69.  
  70.     # test dates just before and after 2007 DST change
  71.     print("pre 2007")
  72.     print("=========")
  73.     unittest(place, datetime.date(2006, 4, 1))
  74.     unittest(place, datetime.date(2006, 4, 2))
  75.     unittest(place, datetime.date(2006, 10, 28))
  76.     unittest(place, datetime.date(2006, 10, 29))
  77.  
  78.     print("2007")
  79.     print("=========")
  80.     unittest(place, datetime.date(2007, 3, 10))
  81.     unittest(place, datetime.date(2007, 3, 11))
  82.     unittest(place, datetime.date(2007, 11, 3))
  83.     unittest(place, datetime.date(2007, 11, 4))
  84.  
  85.     print("Today")
  86.     print("=========")
  87.     unittest(place, datetime.date.today())
  88.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement