About this page...

This web page is based on this meme.

A list of 12 seasons of new york with an arrow pointed to 'The Pollening'

And, while the meme is simple, this web page is... not. It may even be a little over-engineered.

How this Works

My goal with this page to capture, not the astrological or meterological season of New York, but the experiential season of the New Yorker. A creature who lives their lives outside of the traditional American comforts of climate-controlled cars.

For example, if it's a hot in late astrological Winter, the New Yorker's brain knows it's not spring, but is fooled into thinking they can wear a light jacket. Only to be sorely corrected by the city later that night.

This is the New Yorker experiencing Fool's Spring.

Therefore, this web-page updates dynamically based on the day of the year, the hour of the day, and the real-time temperature in NYC.

It uses both live and 53 years of historical data from


To start, I mapped the meme's seasons to a two-dimensional grid of astrological sub-season and the relative temperature of that season.

This part is more feeling than science.


Early Mid Late
Cold Winter Second
Warm Fools Spring


Early Mid Late
Cold Third Winter
Mid Spring of
Actual Spring
Warm The Pollening


Early Mid Late
Cold Summer False Fall
Warm Hell's Front Porch


Early Mid Late
Cold Winter
Mid Actual Fall
Warm Second Summer

Next, I needed to define these axes.


For the early, mid, and late I divided the seasons by into three roughly equal segments using their astrological definitions.

Span Start End
Winter Early Dec 21 Jan 20
Mid Jan 20 Feb 19
Late Feb 19 Mar 20
Spring Early Mar 20 Apr 19
Mid Apr 19 May 19
Late May 22 Jun 21
Summer Early Jun 21 Jul 21
Mid Jul 21 Aug 22
Late Aug 22 Sep 22
Fall Early Sep 22 Oct 22
Mid Oct 22 Nov 21
Late Nov 21 Dec 21

Ranges are inclusive start and exclusive end.

Historical Temperature Distributions

Next, I built a baseline for NYC weather by day of year and hour of day. I pulled hourly temperature data for NYC from Jan 1 1979 to Jan 1 2023 and computed a median and standard deviation for every hour of every day of the year.

If you're interested in exploring this data, it's available in the repo here.

import pandas as pd
weather_df = pd.read_csv("nyc_weather.csv")
weather_df["dt_datetime"] = pd.to_datetime(weather_df.dt_iso.str.replace(" UTC", ""))
weather_df["day_hour"] = weather_df.dt_datetime.dt.strftime("%j-%H")
weather_df = weather_df.groupby(by="day_hour").aggregate({"feels_like": ["mean", "std"]})
hour_temps_df = df.groupby(by="day_hour").aggregate({"feels_like": ["mean", "std"]})["feels_like"]
import json
hour_temps_json = json.dumps(hour_temps_df.to_dict("index"))

From here, we say that a "hot" day is anything that is 1.5 standard deviations above the mean and a "cold" day is anything that is 1.5 standard deviations below the mean.

Now that we have a baseline for what is "normal" we can dynamically compare the current temperature our baseline and decide if it's hot out by calling every time the page loads. We use Time Square for our live temperature reading and compare it to our historical distribution.

Deciding the Season

Using these features we update the arrow using the above logic. If it's late Winter, and we're 1.5 stddevs above the average for this day and hour, we're in 'Fool's Spring'. An explainer to the data we used to make this decision is appended below the header.

This page was made by Devon Peticolas. If you'd like to see the source, fork, or suggest a change please check out it's repo on github.