The latest versions of Wolfram have many new interesting features. I sometimes catch myself not studying them enough, continuing to use what is already known. This post serves as an illustration of both some new functions and the capabilities of the old. Would be very grateful for any improvements and feedback!

Introduction

As DeepSeek said:
​
​The full moon hangs high in the inky sky, a luminous specter casting eerie silver light over the world below.
Its cold, unblinking gaze turns familiar landscapes into ghostly silhouettes,
while long shadows stretch like grasping fingers across the ground.
The sheer size of it, swollen and impossibly bright, feels both awe-inspiring and unsettling —
as if it’s watching, waiting...
Looking once again at high full Moon, I thought:
​can we make some kind of calendar for such events?​
First, we need to define the requirements, what does it mean: "inky sky", "high" etc.

Requirements: shortlist

1. The Moon should be full.​
2. It have to be in upper culmination.
3. There must be night.
4. And... May be SuperMoon?
​​
We will clarify these conditions in the following sections.

Position

You can enter any of your favorite places, or coordinates directly
Next cell is editable and should be evaluated
In[]:=
place=
London
CITY
;​​position=GeoPosition[place];​​timeZone=⌈LocalTimeZone[position,"NumericOffset"]⌉
Out[]=
1

Date range to explore

Next cell is editable and should be evaluated
In[]:=
dates=DateInterval[{DateObject[{2025,4,10,0}],​​DateObject[{2026,4,10,0}]},TimeZonetimeZone]
Out[]=
DateInterval
Beginning: Wed 9 Apr 2025 10 pm
Through: Hour beginning Thu 9 Apr 2026 10 pm


Culminations

Minimum and maximum

How high can we actually see the moon in given place over a long period of time? Firstly we should calculate highest point of celestial equator, which is 90° minus geo altitude.​​
​Secondly we need to add maximal ecliptic declination which is 23.44°. This result is also affected by deviation of the moon from the ecliptic which maximum is 5.14°.
This is initialization cell running automatically at first run of notebook
In[]:=
Clear[minMaxCulminations];​​minMaxCulminations[pos_]:=​​Block[{ϵ=23.44,δ=5.14,λ=Abs@QuantityMagnitude@Latitude@pos},​​{90-ϵ-δ,90+ϵ+δ}-λ];
In[]:=
minMaxCulminations[position]
Out[]=
{9.92,67.08}

Get data

Let’s get all the upper culminations of the Moon in chosen place for a given time period
Next cell should be evaluated; it takes 5-10 sec.
Internet connection and WM version >14.1 required.
There are currently bugs in this function, so need a correction. I wrote in support, hopefully this will be corrected.
In[]:=
event=If[QuantityMagnitude@Latitude@position<=0,"LowerCulmination","UpperCulmination"];​​upperCulminations=AstroRiseSet[Entity["PlanetaryMoon","Moon"],event,position,dates,TimeZone->timeZone];

Time and phase conditions

What is "the night"? Due to observing of the Mon, the most suitable definition related to different types of twilight.​
​Let's select nautical type:
In[]:=
maxSolAngle=Quantity[12,"Degree"];​​timeCondition[date_,pos_,ang_]:=Last@SunPosition[pos,date]<ang;
Now let’s define the phase. Consider a full moon phase more than 0.95, but user can choose their value
In[]:=
fullPhase=0.95;​​phaseCondition[date_,full_]:=MoonPhase@date>full;

First Selection

Now we can choose the nightly culminations close to the full moon
Next cell should be evaluated
In[]:=
selectedData=Select[upperCulminations,​​timeCondition[#,position,maxSolAngle]&&phaseCondition[#,fullPhase]&];​​selectedData//Short
Out[]//Short=

Thu 10 Apr 2025 23:37:57GMT+1
,49,
Sat 4 Apr 2026 02:22:32GMT+1

Before we create a calendar, remember about

Super Moon

A Supermoon is a full moon that nearly coincides with perigee — the closest that the Moon comes to the Earth in its orbit—resulting in a slightly larger-than-usual apparent size of the lunar disk.
Unfortunately Mathematica has no built-in, no resource function for Earth-Moon distance. So here is some custom function, based on this paper.
It works well ±500 years from 2000. Function moonDistScaled returns approximate lunar disk size relative to average in percent.
Initialization cell
In[]:=
Clear[moonDistance,moonDistScaled];​​moonDistance[date_]:=​​Block[{t=QuantityMagnitude@DateDifference[date,DateObject[{2000,1,1}]],​​γ,δ},​​γ=134.963411°+13.064992953°t;​​δ=297.850204°+12.190749117°t;​​Quantity[385000.5584-20905.3550Cos[γ]-3699.1109Cos[2δ-γ]​​-2955.9676Cos[2δ]-569.9251Cos[2γ],"km"]];​​​​moonDistScaled[dist_]:=​​Block[{ma=406720,mp=356352,sa=93,sp=107},​​Quantity[⌈Rescale[dist,{mp,ma},{sp,sa}]⌉,"Percent"]];

Make dataset

Let’s look at the preliminary data
Next cell should be evaluated
We see fool moon nightly culminations appear several days in a row but at different heights. We can combine the nearest dates by highlighting the one with max height.
Next cell should be evaluated
Initialization cell
Next cell should be evaluated

Spooky Moon Calendar

Colors

Printable version

CITE THIS NOTEBOOK

Astronomy with Mathematica: Spooky moon calendar​
by Denis Ivanov​
Wolfram Community, STAFF PICKS, April 14, 2025
​https://community.wolfram.com/groups/-/m/t/3443595