I live near Nashville, TN, a climate that is classified as a Cfa by the Koppen classification, the C indicating a coldest month average between 0 and 18 C (32 to 64 F), the F a relatively even precipitation distribution (no dry season) and the A a hot summer, with a warmest month average of 22 C or warmer (72 F+).
Nashville is a cold-end Cfa; if winters were a few degrees colder, it would be a Dfa.
The average (mean of high/low) in January is 3.2 C / 37.4 F in January and 26.3 C / 79.4 F in July. With a 23.1 C / 42.0 F difference, temperature is the main driver of seasons here. Folks, this is a climate that gets four distinct seasons.
What mean temperature defines each season? A good rule of thumb is that temperatures in the top 20% of the average range (or higher) are summer, and vice versa for winter. 20% of 23.1 C / 42.0 F is 4.6 C / 8.4 F, which would suggest that average temperatures of 7.8 C / 45.8 F or colder are "winter" and 21.9 C / 71.0 F or warmer is "summer". Since the Dfa cutoff of 72 was so close, and summer stayed the longest season (it's more stable than winter), I rounded up that number.
I came up with anything colder than 46 F (8 C) would be considered "winter", and warmer than 72 F (22 C) would be considered summer. But in many climates, Nashville included, temperatures jump all over the place. March 1, 1997 for instance had a mean temperature of 74 (23 C). On the opposite end of the spectrum, October 7, 2000's mean temperature was 44 (7 C). Should those dates be considered "summer" and "winter" respectively? No, they're just unseasonable heat and unseasonable cold.
So I use a 21-day running average, with the value being for the 11th day (the day in the center). This reduces the impact of unseasonable days and gives a more long-term look.
For instance, the day I got my car, May 4, 2013, had a mean temperature of 8 C / 47 F (high 10 C / 50 F, low 7 C / 44 F). But the running average for that day was 15.7 C / 60.2 F, because it takes into account the mean temperature from April 24 - May 14, 2013 (the 21 days with May 4 as their center).
If the 21-day running average was below 46, it was "winter", above 72, it was "summer". The in-between areas were called "spring" and "fall".
Usually, it was straightforward; the 21-day running average would fall below or rise above 46 or 72 and would not return until the end of the season. But sometimes it didn't work that way. For instance, January 25-31, 2012 averaged above 46 in their 21-day running averages, but February 1-20, 2012 returned to below 46. Since February 1-20 was 20 days and January 25-31 was 7 days, January 25-31 was considered "winter", as the 20 days outnumbered the 7. Hey, mild spells are part of winter here too.
I took data from January 1, 1959 to December 31, 2016 and found when each season lasted during the 58-year span (a total of 58 winters, 58 springs, 58 summers, and 58 falls). I then found out how likely each day was to fall in a particular season. For instance, today, June 18, fell in summer 98% of years (it was spring in 1961), thus it would be considered a summer day as it fell in summer the majority of years. For ties (29 of 58 years), the date was given to the warmer season; September 16 and November 28 were ties and were given to summer and fall, respectively.
I also have data up to June 17, 2017, but didn't want to use an incomplete year in my data set.