Sunrise and Sunset Times

[1]:
import satkit as sk
import datetime
import pytz
import plotly.graph_objects as go
[2]:
# Array of times for each day of 2024
basetime = sk.time(2024, 1, 1)
timearr = [basetime + sk.duration(days=i) for i in range(365)]

# Coordinates of Arlington, MA
coord = sk.itrfcoord(latitude_deg=42.1514, longitude_deg=-71.1516)


# sunrise, sunset in UTC
riseset = [sk.sun.rise_set(t, coord) for t in timearr]
rise, set = zip(*riseset)

# Convert to Eastern Time
drise = [r.datetime().astimezone(pytz.timezone("America/New_York")) for r in rise]
dset = [s.datetime().astimezone(pytz.timezone("America/New_York")) for s in set]

# Hour of day, in [0,24]
risefrac = [r.hour + r.minute / 60 + r.second / 3600 for r in drise]
setfrac = [s.hour + s.minute / 60 + s.second / 3600 for s in dset]

# Convert hour of day to a time
risetime = [datetime.time(hour=r.hour, minute=r.minute, second=r.second) for r in drise]
settime = [datetime.time(hour=s.hour, minute=s.minute, second=s.second) for s in dset]
[3]:
def frac2str(y):
    return y.strftime("%H:%M:%S")


risestring = [frac2str(r) for r in risetime]
setstring = [frac2str(s) for s in settime]

fig = go.Figure()
fig.add_trace(
    go.Scatter(
        x=[x.datetime() for x in timearr],
        y=risefrac,
        customdata=risestring,
        name="Sunrise",
        mode="lines",
        line=dict(color="rgb(0,100,80)"),
        hovertemplate="Date: %{x}<br>Sunrise: %{customdata}<extra></extra>",  # Custom hover text
    )
)
fig.add_trace(
    go.Scatter(
        x=[x.datetime() for x in timearr],
        y=setfrac,
        name="SunSet",
        mode="lines",
        fill="tonexty",
        customdata=setstring,
        fillcolor="rgba(0,100,80,0.2)",
        line=dict(color="rgb(0,100,80)"),
        hovertemplate="Date: %{x}<br>Sunset: %{customdata}<extra></extra>",  # Custom hover text
    )
)
fig.update_yaxes(title="Local Hour of Day")
fig.update_xaxes(title="Date")
fig.update_layout(
    title="Sunrise and Sunset Times for 2024 in Arlington, MA",
    xaxis=dict(
        gridcolor="#dddddd",
        gridwidth=1,
        showline=True,
        mirror=True,
        linewidth=2,
        linecolor="black",
    ),
    yaxis=dict(
        gridcolor="#dddddd",
        gridwidth=1,
        showline=True,
        mirror=True,
        linewidth=2,
        linecolor="black",
        range=[0, 24],
        tickvals=[0, 6, 12, 18, 24],  # Set y-axis tick positions
        ticktext=["Midnight", "6 AM", "Noon", "6 PM", "Midnight"],
    ),
    plot_bgcolor="white",
    paper_bgcolor="white",
    width=600,
    height=520,
)
fig.show()