Skip to main content

pysunNOAA

Python implementation of NOAA’s Solar Position Calculators

NOAA has the calculation details at their website at Solar Calculation Details

pysunNOAA is based on the spreadsheet NOAA_Solar_Calculations_day.xls . All the calculation cells in row 2 of the spreadsheet are implemented in pysunNOAA. This is a work in progress. But it is fully usable at this point

Sun Position

Here is what it can do:

import datetime
from pysunnoaa import noaa

latitude = 40 # Latitude (+ to N)
longitude = -105 # Longitude (+ to E)
timezone = -6 # Time Zone (+ to E)
thedatetime = datetime.datetime(2010, 6, 21, 9, 54)

altitude, azimuth = noaa.sunposition(
latitude, longitude, timezone, thedatetime, atm_corr=True
)

print(f"{altitude=}, {azimuth=}")

>> altitude=47.36178497432497, azimuth=98.30691558695895

The above calculation is corrected for atmospheric diffraction. We can also do the calculation without the correction for atmospheric diffraction by setting atm_corr=False:

altitude, azimuth = noaa.sunposition(
    latitude, longitude, timezone, thedatetime, atm_corr=False
)
print(f"{altitude=}, {azimuth=}")

>> altitude=47.346932081680364, azimuth=98.30691558695895

Many Sun Positions

Let us take a look at generating multiple sun positions for a time series. First we have to generate the time series:

thedates = noaa.datetimerange(
    datetime.datetime(2024, 6, 21, 10), # start
    datetime.datetime(2024, 6, 21, 11), # stop
    minutes=10 # step
) # The arguments are similar to python's range.
  # It returns a generator
for thedate in thedates:
    print(thedate)

2024-06-21 10:00:00
2024-06-21 10:10:00
2024-06-21 10:20:00
2024-06-21 10:30:00
2024-06-21 10:40:00
2024-06-21 10:50:00

So let us generate the sun positions for this time series:

thedates = noaa.datetimerange(
    datetime.datetime(2024, 6, 21, 10),
    datetime.datetime(2024, 6, 21, 11),
    minutes=10
)

positions = noaa.sunpositions(latitude, longitude, timezone, thedates, atm_corr=False)
for altitude, azimuth in positions:
    print(f"{altitude=}, {azimuth=}")

altitude=48.44972994443188, azimuth=99.43756106034147
altitude=50.33276597510335, azimuth=101.44934328356527
altitude=52.20206053830976, azimuth=103.57347468902549
altitude=54.05415607848319, azimuth=105.82830623146941
altitude=55.88497413825557, azimuth=108.23537482765607
altitude=57.689656999063025, azimuth=110.82001062044083

Let us print this again:

for altitude, azimuth in positions:
    print(f"{altitude=}, {azimuth=}")

WHAT !!! Why did it not print anything ??

Both noaa.datetimerange and noaa.sunpositions are generators. Once you loop through the generator, the values are exhausted (or emptied). To get the values again you will need to call the functions again:

thedates = noaa.datetimerange(
    datetime.datetime(2024, 6, 21, 10),
    datetime.datetime(2024, 6, 21, 11),
    minutes=10
)

positions = noaa.sunpositions(latitude, longitude, timezone, thedates, atm_corr=False)
for altitude, azimuth in positions:
    print(f"{altitude=}, {azimuth=}")

altitude=48.44972994443188, azimuth=99.43756106034147
altitude=50.33276597510335, azimuth=101.44934328356527
altitude=52.20206053830976, azimuth=103.57347468902549
altitude=54.05415607848319, azimuth=105.82830623146941
altitude=55.88497413825557, azimuth=108.23537482765607
altitude=57.689656999063025, azimuth=110.82001062044083

Sunrise and Sunset

Another useful thing is to be able to calculate sunset and sunrise. Here we go:

sunrise = noaa.sunrise(40, -105, -6, datetime.datetime(2010, 6, 21))
sunset = noaa.sunset(40, -105, -6, datetime.datetime(2010, 6, 21))
print(f"{sunrise=}")
print(f"{sunset=}")

>> sunrise=datetime.datetime(2010, 6, 21, 5, 31, 15, 842680)
>> sunset=datetime.datetime(2010, 6, 21, 20, 32, 8, 805539)

That’s all for now.

Metadata

Release files for pysunnoaa 0.1.8

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pysunnoaa 0.1.8
File Size Uploaded
pysunnoaa-0.1.8.tar.gz 12.3 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for pysunnoaa 0.1.8
File Interpreter ABI Platform
pysunnoaa-0.1.8-py3-none-any.whl Python 3 none any Details

Total release size: 24.7 kB

Release files / pysunnoaa-0.1.8.tar.gz

Download URL pysunnoaa-0.1.8.tar.gz
Size 12.3 kB
Tags Source
SHA-256 checksum
How to use checksums
8a7ebb289f0c155d19789b2ef79b6cd217bd6986df90d52011124299c2ecb109
BLAKE2b-256 checksum
How to use checksums
601b2b590b78fc29631d5663a01f5902df39d78396fd0a5aef6a17070ccc7bdc
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.11.3 Darwin/23.2.0

Release files / pysunnoaa-0.1.8-py3-none-any.whl

Download URL pysunnoaa-0.1.8-py3-none-any.whl
Size 12.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
443c65c0e656cbf2674f10bdfacbe8b4002e353ce2a03313f21301d98c004e91
BLAKE2b-256 checksum
How to use checksums
e93860f6054b10eafd6b679c80ba7ce4cc1763a397ec0ba67dc0dda44fe1ee5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via poetry/1.7.1 CPython/3.11.3 Darwin/23.2.0

Release history Release notifications | RSS feed

This release

0.1.8 This release

2 release files

0.1.7

2 release files

0.1.6

2 release files

0.1.5

2 release files

0.1.4

2 release files

0.1.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page